2017-01-03 28 views
0

Eclipseでプロジェクトを実行しているときにログが作成されますが(ライブラリ処理オプション:生成されたJARに必要なライブラリを抽出する)、構成ファイルが見つかりませんログは生成されません。Eclipseで作成されたRunnable jarファイルの外部log4j2構成ファイルを指定する方法

コマンドライン(実行可能なjarファイルを含むディレクトリにcd)を介してjarファイルを実行すると、次が出力されます。メッセージの

ERROR StatusLogger Unrecognized format specifier [d] 
ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern. 
ERROR StatusLogger Unrecognized format specifier [thread] 
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern. 
ERROR StatusLogger Unrecognized format specifier [level] 
ERROR StatusLogger Unrecognized conversion specifier [level] starting at position 35 in conversion pattern. 
ERROR StatusLogger Unrecognized format specifier [logger] 
ERROR StatusLogger Unrecognized conversion specifier [logger] starting at position 47 in conversion pattern. 
ERROR StatusLogger Unrecognized format specifier [msg] 
ERROR StatusLogger Unrecognized conversion specifier [msg] starting at position 54 in conversion pattern. 
ERROR StatusLogger Unrecognized format specifier [n] 
ERROR StatusLogger Unrecognized conversion specifier [n] starting at position 56 in conversion pattern. 
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. 

最後のビットは、設定ファイルが見つからないことを私に語りました、どこからでもPatternLayoutの設定を読み込んでいます。オプション-Dlog4j.configurationFileオプションがコマンドに追加されたときに、次の例外が(以前のエラーメッセージに加えて)発生:私はC」と-Dlog4j.configurationFile値を指定しようとしている

Exception in thread "main" java.lang.ExceptionInInitializerError 
Caused by: java.lang.NullPointerException: No Configuration was provided 
     at java.util.Objects.requireNonNull(Unknown Source) 
     at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java 
:477) 
     at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:561) 
     at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:577) 
     at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:212) 
     at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextF 
actory.java:242) 
     at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextF 
actory.java:45) 
     at org.apache.logging.log4j.LogManager.getContext(LogManager.java:174) 
     at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:618) 
     at test.SmokeTest.<clinit>(SmokeTest.java:41) 

:/ path/to/config/log4j2.xml "と" file:// c:/path/to/config/log4j2.xml "と同じエラーが発生します。例外メッセージの最後の行は、ロガーの初期化です。 はコードでは、私は、次のオプションでロガーを初期化しようとしている:

- private static final Logger logger = 
    LogManager.getLogger("c:/path/to/config/log4j2.xml"); 
- private static final Logger logger = LogManager.getLogger("logger name specified in config file"); 

ファイルに書き込む前に、私はlog4j.configurationFileシステムプロパティを設定します。

- System.setProperty("log4j.configurationFile", "C:\\path\\to\\config\\log4j2.xml") 
- System.setProperty("log4j.configurationFile", "file://c:/path/to/config/log4j2.xml") 

IもBasicConfigurator.configure()とPropertyConfigurator.configure()は、元のlog4j(log4jの-1.2からインポートorg.apache.log4j.BasicConfiguratorとにPropertyConfiguratorをインポートからの方法を用いて試みた:以下のオプションを試してみました。 17.jar)。

log4j2が外部ファイルから設定を取得できなかった可能性があると考えて、log4j2.xmlファイルのコピーをプロジェクトのsrcフォルダに置きます。次に、ロガーを初期化しようとしました:

- private static final Logger logger = LogManager.getLogger(MyClass.class.getName()); 
- private static final Logger logger = LogManager.getLogger(SmokeTest.class); 

どちらも私には同じエラーが表示されましたが、それはEclipseから実行すると動作するのでしょうか?

また、プログラムアイコンをダブルクリックするか、-Dlog4j.configurationFileオプションを付けずにコマンドラインから実行すると、アプリケーションは起動しますが、ログは生成されません。

この問題のトラブルシューティングを手伝ってください。さらに詳しい情報を提供する必要がある場合はお知らせください。私はこれまで同様の質問がされてきたことは知っていますが、問題の解決策を見つけることができません。実行可能なjar、Eclipse、外部log4j2構成ファイルAntまたはMavenを使用していません。

+0

* "構成ファイルが見つかりません" *は、構成ファイルをjarファイルにパッケージ化しなかったことを意味します。 – Andreas

+0

私はsrcディレクトリと "Add to Build Path"オプションを有効にしたサブディレクトリ内に直接設定ファイルを置こうとしました。 Eclipseがjarファイルをパッケージ化するように設定ファイルをどこに置くべきですか? もっと重要なのは、私の質問は、(ユーザーが設定できるようにファイルシステム上にある)jarファイルに含まれていない構成ファイルをどのように利用できるかということです。それも可能ですか? – Jayden67

答えて

1

私の問題は、私はそれを初期化する前にログを呼んでいたということでした。
すべてが正しくパッケージ化されており、メインクラスにlog4jの適切なコードがありました。この犯人は、メイン実行前に初期化されたクラスレベルのオブジェクトでした。そのオブジェクトのコンストラクタは、その作成を記録しました。これは、Eclipseでデバッグするときにエラーは発生しませんでしたが、実行可能ファイルが実行されなくなりました。
新しいプロジェクトからやり直すための理想を私に与えてくれてありがとう@Andreas。

0

間違っていることは分かりませんが、こちらはMCVEです。

Test.java

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

public class Test { 
    private static transient Logger log = LogManager.getLogger(Test.class); 
    public static void main(String[] args) { 
     log.info("Hello World"); 
    } 
} 

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    </Appenders> 
    <Loggers> 
    <Root level="info"> 
     <AppenderRef ref="Console"/> 
    </Root> 
    </Loggers> 
</Configuration> 

ビルド・パスEclipseにApache Log4j 2を追加:log4j-api-2.7.jarlog4j-core-2.7.jarを。

File>Export...>Runnable JAR file>Extract required libraries into generated JARTest.jarのjarファイルを作成します。

ラン:

java -Dlog4j.configurationFile=C:\path\to\log4j2.xml -jar Test.jar 

出力

14:06:23.728 [main] INFO Test - Hello World 
+0

ありがとう、新しいプロジェクトでMCVEを再起動すると、エラーが見つかりました。私はロガーを初期化する前にロギング機能を呼び出すことができました。 – Jayden67

関連する問題