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

您可以使用此示例: 如何使用相同的 log4j 记录器将不同的信息写入两个不同的文件?

然后在您的程序中决定使用哪个记录器。

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

也许您已将记录器配置为已经包含 ConsoleAppender?您应该尝试显示所有 Appender:尝试使用 Logger.getAllAppenders() 并显示它们的类。

您还可以查看 log4j.properties 和 log4j.xml 文件。

于 2012-05-25T13:57:34.853 回答