3

Log4Jには厄介な制限があるようです。実行時に変数置換が機能しないようです。

この例では

ファイル: Log4j.properties

file_pattern=%d{ISO8601} %-5p %m%n

log4j.rootLogger=DEBUG、FileAppender

log4j.appender.FileAppender=org.apache.log4j.FileAppender log4j.appender.FileAppender.layout=org.apache.log4j.PatternLayout log4j.appender.FileAppender.layout.ConversionPattern=${file_pattern} log4j.appender.FileAppender.File= log4jtest1.log

log4j.appender.FileAppender.Threshold=エラー

log4j.properties ファイルで構成された FileAppender は、正しい出力を生成します。

ファイル: log4jtest1.log

ERROR エラー メッセージの例 FATAL 致命的なメッセージの例

実行時に FileAppender を作成しようとすると

import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public class Main {
    static final Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) throws Exception {

        FileAppender appender = new FileAppender();
        appender.setFile("log4test2.log");

        PatternLayout pl = new PatternLayout("${file_pattern}");

        appender.setLayout(pl);
        appender.setName("log4jtest2");
        appender.setThreshold(Level.ERROR);
        appender.activateOptions(); 
        logger.addAppender(appender);

        logger.trace("Sample trace message");
        logger.debug("Sample debug message");
        logger.info("Sample info message");
        logger.warn("Sample warn message");
        logger.error("Sample error message");
        logger.fatal("Sample fatal message");
    }
}

出力は

ファイル: log4jtest2.log

${file_pattern}${file_pattern}

何が問題なのか、どうすれば修正できるのか、誰でも説明できますか?

関連する質問: アプリケーションは、代用される変数を読み取るために ResourceBundle にアクセスできますか?

4

2 に答える 2

8

変数置換は、PatternLayout ではなくPropertyConfiguratorの機能です。コードを見ると、file_pattern がどうあるべきかを定義していません。しかし、なぜコードで変数置換が必要になるのでしょうか? これを行うだけです:

 PatternLayout pl = new PatternLayout("%d{ISO8601} %-5p %m%n");

その文字列を別の場所で参照したい場合は、定数にしてください。

編集: プロパティ オブジェクトを読み取る必要がありますが、PropertyConfigurator はファイルの代わりにプロパティ オブジェクトを取得できるため、それをロードし、必要なことを実行して PropertiesConfigurator に渡すことができるため、構成パスは 1 つしかありません。

于 2009-11-23T14:26:10.407 に答える
1

手動でロードできます:

Properties props = new Properties();
InputStream fis = new FileInputStream(new File("/somewhere/log4j.properties")); 
props.load(fis);
fis.close();
PatternLayout layout = new PatternLayout(props.getProperty("file_pattern"));
于 2009-12-08T21:39:36.927 に答える