2012-05-25 83 views
0

我想根据变量将log4j日志写入标准输出或文件。如果设置了变量writeLogToFile,则日志应该写入文件,否则写入标准输出。将日志写入标准输出或log4j中的文件java

我已经尝试使用下面的代码,但日志被写入文件以及标准输出。

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*/ 
    } 
} 

当我希望日志写入标准输出时,默认情况下会将日志写入标准ouptput。但是,当我想将日志写入文件时,这会失败。日志既写入标准输出也写入文件。

所以,我试了下面的代码,但这也没有奏效。

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则日志写入标准输出,否则写入文件。

+0

粘贴你的log4j配置文件 – Drona

+0

我在保罗答复的答复中粘贴了配置文件。顺便说一句,我找到了解决方案,并且我已经相应地编辑了我原来的帖子。 – jyotesh

回答

0

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

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

+0

如果我使用logger.getAllAppenders(),那么它只显示一个属于FileAppender的appender。如果我使用Logger.getRootLogger()。getAllAppenders(),那么它只显示一个Appender,它是一个ConsoleAppender。 – jyotesh

+0

无论如何,我找到了我在编写问题时编写的解决方案。谢谢你的帮助。 – jyotesh