0

log4j の仕組みを理解したい。このサイトから多くのチュートリアルとすべての回答を読みましたが、まだ機能する具体的な例は得られませんでした。

私はこれを試しました:

import org.apache.log4j.*;

public class Exercise {
    private static Logger logger = Logger.getLogger(SimpleLogger.class);

    public static void main(String args[]) {

        BasicConfigurator.configure();

        // ConsoleAppender myAppender = new ConsoleAppender(null, "System.out");
        // myAppender.setLayout(new SimpleLayout());
        // logger.addAppender(myAppender);

        for (int i = 0; i < 5; i++) {
            logger.info("You are here!");
        }

        logger.info("End of program");
    }
}

このクラスでは:

import org.apache.log4j.spi.LoggingEvent;

public class SimpleLogger extends org.apache.log4j.Layout {

    @Override
    public void activateOptions() {

    }

    @Override
    public String format(LoggingEvent event) {
        return "log message = " + event.getMessage().toString() + "/n";
    }

    @Override
    public boolean ignoresThrowable() {
        return true;
    }
}

しかし、私の出力は次のとおりです。

0 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - You are here!
1 [main] INFO SimpleLogger  - End of program

私も試してみましたが、コードはコメントされていませんが、二重形式の出力しか得られませんでした。

質問: 出力 (コンソールまたはファイル) を希望の形式にするにはどうすればよいですか? (log4j.properties) のような外部ファイルを変更する必要がありますか?

4

3 に答える 3

1

この行:

private static Logger logger = Logger.getLogger(SimpleLogger.class);

ロギングの現在のコンテキストが SimpleLogger であることをデフォルトのロガーに通知するだけです。基になるロガーの実装は指定しません。実際、カスタム ロガーを実装する必要はまったくありません。構成ファイルで形式を指定できる構成ツールを使用するだけです。一般的な手法は、XmlConfigurator を使用することです。その場合、XML 構成ファイルは、さまざまなコンテキストでの書式設定に関して非常に具体的になります。XML ベースの構成の詳細については、こちらを参照してください。

于 2012-07-24T13:29:21.483 に答える
0

プロパティ ファイルに log4j 構成を含めることをお勧めします。
指定ConversionPatternすることで、目的の出力形式を取得できます。例えば

log4j.appender.rollingFile.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
于 2012-07-24T13:26:06.520 に答える
0

この線:

private static Logger logger = Logger.getLogger(SimpleLogger.class);

ロガーがあなたのクラスを使用してログを記録するという意味ではなく、log4j.properties ファイルで呼び出されたロガーを検索しSimpleLogger(または、パッケージ内にある場合は検索しますsome.package.SimpleLogger)、パターン レイアウトを使用することを意味します。そのロガーに対して定義されています。

そのロガーが見つからない場合、デフォルトでルート ロガーが設定され、ルート ロガー アペンダーのパターン レイアウトが使用されます。

于 2012-07-24T13:29:10.753 に答える