0

変数に応じてlog4jのログを標準出力やファイルに出力したい。変数 writeLogToFile が設定されている場合、ログはファイルに書き込まれ、それ以外の場合は標準出力に書き込まれます。

次のコードを試してみましたが、ログはファイルと標準出力の両方に書き込まれます。

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

    public static void main(String[] args) {
        /*some code which sets variables writeLogToFile and logFile*/

        BasicConfigurator.configure();
        if(writeLogToFile) {
            FileAppender fappender = new FileAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), logFile);
            logger.addAppender(fappender);
        }

        /*some code which uses info and debug methods to write log*/
    }
}

これは、デフォルトでログが標準出力に書き込まれるため、ログを標準出力に書き込む場合に機能します。しかし、ログをファイルに書き込もうとすると、これは失敗します。ログは、標準出力とファイルの両方に書き込まれます。

そこで、次のコードを試してみましたが、これもうまくいきませんでした。

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

    public static void main(String[] args) {
        /*some code which sets variables writeLogToFile and logFile*/

        BasicConfigurator.configure();
        if(writeLogToFile) {
            FileAppender fappender = new FileAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), logFile);
            logger.addAppender(fappender);
            Properties logProperties = new Properties();
            logProperties.setProperty("log4j.additivity.notRootLogger", "false");
            PropertyConfigurator.configure(logProperties);
        }

        /*some code which uses info and debug methods to write log*/
    }
}

私もフォローしてみました

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

    public static void main(String[] args) {
        /*some code which sets variables writeLogToFile and logFile*/

        BasicConfigurator.configure();
        if(writeLogToFile) {
            FileAppender fappender = new FileAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), logFile);
            logger.addAppender(fappender);
        }
        else {
            ConsoleAppender cappender = new ConsoleAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), "System.out");
            logger.addAppender(cappender);
        }

        /*some code which uses info and debug methods to write log*/
    }
}

誰かがこの問題を解決するのを手伝ってくれますか?

[編集]

わかった。私は問題を解決したと思います。logger.setAdditivity(false);このようなコードに行を追加しました

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

    public static void main(String[] args) {
        /*some code which sets variables writeLogToFile and logFile*/

        BasicConfigurator.configure();
        if(writeLogToFile) {
            FileAppender fappender = new FileAppender(new PatternLayout("%-6p [%t] (%F:%L) %m%n"), logFile);
            logger.addAppender(fappender);
            logger.setAdditivity(false);    //added line here
        }

        /*some code which uses info and debug methods to write log*/
    }
}

現在、正常に動作しています。その場合writeLogToFile=true、ログは標準出力に書き込まれ、それ以外の場合はファイルに書き込まれます。

4

2 に答える 2

0

すでに ConsoleAppender を含むようにロガーを構成している可能性がありますか? すべてのアペンダーを表示するようにしてください: Logger.getAllAppenders() を使用してそれらのクラスを表示してみてください。

log4j.properties および log4j.xml ファイルを調べることもできます。

于 2012-05-25T13:57:34.853 に答える
0

この例を使用できます: log4j の同じロガーを使用して、2 つの異なるファイルに異なる情報を書き込む方法は?

次に、プログラムで使用するロガーを決定します。

if(writeLogToFile)
   logger.debug("My normal log");
else
   otherLogger.info("My special text");
于 2012-05-25T14:02:49.507 に答える