Eclipseでプロジェクトを実行するとログが作成されますが、実行可能なjarが作成されると(ライブラリ処理オプション:必要なライブラリを生成されたJARに抽出)、構成ファイルが見つからず、ログは生成されません。
コマンドラインからjarを実行すると(実行可能なjarを含むディレクトリにcd)、次のように出力されます。
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オプションをコマンドに追加すると、(前のエラーメッセージに加えて)次の例外が発生します。
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)
-Dlog4j.configurationFileの値を「c:/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")
また、元のlog4j(log4j-1.2.17.jar)からインポートorg.apache.log4j.BasicConfiguratorおよびPropertyConfiguratorをインポートして、BasicConfigurator.configure()メソッドとPropertyConfigurator.configure()メソッドを使用してみました。
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を使用していません。
私の問題は、ログを初期化する前にログを呼び出していたことでした。
すべてが正しくパッケージ化され、メインクラスにはlog4jの適切なコードが含まれていました。原因は、メインが実行される前に初期化されたクラスレベルのオブジェクトでした。そのオブジェクトのコンストラクターは、その作成をログに記録しました。これにより、Eclipseでのデバッグ時にエラーは発生しませんでしたが、実行可能ファイルの実行が停止しました。
新しいプロジェクトからやり直すという理想を与えてくれた@Andreasに感謝します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加