システムログとユーザログを区別したい。システムログは開発者や管理者が見るものです。ユーザログには、技術的な詳細がすべてなくてもシステム情報がユーザに提供されます。私は別のログメッセージを異なるファイルに保存したいと思っています。ひとつは技術者用、もう一つはユーザー用です。複数のlog4j2ロガーの設定
カスタムレベルとフィルタを含む多くのオプションを検討しました。フィルターがユーザーのメッセージを識別するために使用できるメッセージの先頭にキーワードを追加することができます。標準のエラーレベルを使用するユーザーメッセージ用に別のロガーを追加することを試しています。
私はテストのための簡単なデモプログラムを書いています。 2つのロガーが作成され、いくつかのエラー・メッセージが生成されます。私は、configファイルで
package demo;
import java.io.IOException;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Logdemo {
private final static Logger logger = LogManager.getLogger();
private final static Logger userLog = LogManager.getLogger("demo.userMsg");
public static void main(String[] args) throws IOException {
try {
((Object) null).toString();
} catch (Exception e) {
logger.error("error message", e);
}
try {
((Object) null).toString();
} catch (Exception e) {
logger.fatal("User level Red message" ,e);
}
try {
((Object) null).toString();
} catch (Exception e) {
userLog.error("User level Amber message" ,e);
}
logger.info("Errors Logged");
userLog.info("Lunch is served.");
}
}
:このことから
<Loggers>
<Root level="all">
<AppenderRef ref="RollingFile" level="ALL"/>
<AppenderRef ref="Console" level="ALL"/>
</Root>
<userMsg name="demo.userMsg" level = "all">
<AppenderRef ref="UserMsgFile" level="ALL"/>
</userMsg>
</Loggers>
</Configuration>
私は、NetBeansから、次のエラーメッセージが出ます:
run:
2017-09-18 22:20:13,933 main ERROR Error processing element UserMsgFile [Appenders: null]): CLASS_NOT_FOUND
2017-09-18 22:20:13,936 main ERROR Error processing element userMsg ([Loggers: null]): CLASS_NOT_FOUND
22:20:14.038 [main] INFO demo.Logdemo - logger starting...
22:20:14.040 [main] ERROR demo.Logdemo - error message
を例外メッセージのすべてがコンソールに書き込まれ、 userLogのメッセージも含まれます。だから私は両方のロガーが動作していることを知っています。ロガーアペンダーはファイルにOKを書き込みます。ほとんど同じアペンダーを使用するuserLogロガーによって作成されるファイルはありません。
私はlog4j2がロガーを見つけることを許可するために何かを正しく指定していないようです。私はそれを正しくするために命名の様々な組み合わせを試みたが、私は問題が何であるか把握することはできません。
私がまだ持っていないもう一つのことは、異なるクラス間でuserLogロガーを使用することです。ユーザーログメッセージが生成されたクラスを知る必要はありません。そのため、すべてのクラスで、クラス識別子なしで同じロガー名を使用したいと考えています。私はそれができないと思う。
私の質問は次のとおりです: 設定ファイルにはどのようなエラーがありますか?
編集: 次の設定エントリが機能します。これは2つのロガーを与える。 2つの問題がありました。 1つは、ロガーの名前がパッケージ名であるということでした。もう一つは、Loggerという言葉を正しく使用しなかったということでした。
<Loggers>
<Logger name="demo" level="all"> <!-- name = package name -->
<AppenderRef ref="UserLogFile" level="ALL" />
</Logger>
<Root level="all">
<AppenderRef ref="Console" level="ALL"/>
<AppenderRef ref="SystemLogFile" level="ALL"/>
</Root>
</Loggers>
各クラスのLoggerの開始にクラス名を含める必要がありますか?
編集:パッケージ名を含める必要がありました。これは私を理解するために私を取った。
私が持っていたもう一つの問題は、log4j2のデバッグメッセージを有効にしていたことです。これは次のように達成されます:
<Configuration status="WARN"> <!-- to debug, set status="TRACE" -->
こんにちは、あなたのアプローチのどちらかがうまくいくはずです。 「ログメッセージにマーカーを追加すると、別のアペンダーを使用してユーザーメッセージを処理できます」というメッセージが表示されますが、マーカーなしでこれを行うことは可能です。マーカを使用しないと複数のロガーを作成する必要があり、読みにくくなることがあるため、マーカーを使って正しい方向に進んでいると思います。 –
もう1つのこと - あなたの "デモ"ロガーを持っている唯一の理由は、 "UserLogFile"アペンダーを割り当てることです。本当にこのロガーは必要ありません。あなたのアペンダーはMarkerFilterを持っているので、あなたはそれをルートロガーに割り当てることができ、同じ方法で動作するはずです。 –
こんにちは#D.Bロガーのカーブを覚えていて(そしてまだまだ道のりは)、私が書いたコードが仕事をしています。私はデモロガーが必要ではないことがわかりますが、私が何をしたのか忘れてしまった場合、2年後にコードを読みやすくすると思います。 – dazz