1

私の仕事では、sandalone アプリケーションの保守を継承しています。
次のコードは Log4J を構成しますが、コンソールにメッセージが表示されません。

    LogManager.resetConfiguration();

    PatternLayout layout = new PatternLayout();
    layout.setConversionPattern("RECORD-BACKEND / (%-5p) %m (%F:%L)%n");

    ConsoleAppender stderr = new ConsoleAppender(); 
    stderr.setTarget(ConsoleAppender.SYSTEM_ERR);
    stderr.setLayout(layout);
    stderr.addFilter(new CurrentThreadLogFilter());
    stderr.setThreshold(Level.INFO);
    stderr.activateOptions();

    Logger loggerRECORD = getLoggerRECORD();
    loggerRECORD.setAdditivity(false);
    loggerRECORD.addAppender(stderr);

    Logger root = Logger.getRootLogger();
    root.setLevel(Level.WARN);
    root.addAppender(stderr);

    // some lines forward ...

    loggerRECORD.info("Process starting...");

何が欠けていますか?

4

2 に答える 2

4

残念ながら、実際にメッセージを出力するコードを送信していません。ただし、次のようなことをしようとしていると想定できます。

logger.info("my message");

rootこの場合、警告を出力するように定義されたロガーによって除外されるため、メッセージは出力されません。

Log4J のロガーは、階層構造として格納されます。rootロガーは、このツリーへのエントリ ポイントです。各ロガーは、設定されたレベルに従ってログ メッセージをフィルタリングします。したがって、上位レベルのロガー(あなたの場合はルート)がログメッセージをフィルタリングすると、それは下位レベルのロガーにも届かず、間違いなくアペンダーにも届きません。

解決策は、すべてのメッセージを許可するようにルート ロガーを定義することです。

最後に、ロガーをプログラムで構成する特別な理由はありますか? Log4J は、プロパティまたは (より適切な) xml ファイルを使用して構成できます。このドキュメントを見てください。

そして、さらに別のメモ。Log4J はその作成者によって廃止されました。今から始める場合は、Logbackをロガーとして、SLF4Jを軽量ログ インターフェイスとして使用してください。

于 2013-05-24T11:03:18.153 に答える
0

AlexR のおかげで、ここで私の問題をどのように解決したか:

    LogManager.resetConfiguration();

    PatternLayout layout = new PatternLayout();
    layout.setConversionPattern("RECORD-BACKEND / (%-5p) %m (%F:%L)%n");

    ConsoleAppender stderr = new ConsoleAppender(); 
    stderr.setTarget(ConsoleAppender.SYSTEM_ERR);
    stderr.setLayout(layout);
    stderr.addFilter(new CurrentThreadLogFilter());
    stderr.setThreshold(Level.INFO);
    stderr.activateOptions();

    Logger loggerRECORD = getLoggerRECORD();
    loggerRECORD.setLevel( /* get Log Level from env. */ );
    loggerRECORD.setAdditivity(false);
    loggerRECORD.addAppender(stderr);

    Logger root = Logger.getRootLogger();
    root.setLevel(Level.WARN);
    root.addAppender(stderr);

    // some lines forward ...

    loggerRECORD.info("Process starting...");

に対して加算性が false に設定されているためloggerRECORD、アペンダーは INFO から ERROR までのメッセージを正常に出力します。

于 2013-05-24T16:21:45.660 に答える