2012-05-25 4 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*/ 
    } 
} 

Это работает, когда я хочу, чтобы журнал записывался на стандартный вывод, поскольку по умолчанию журнал записывается в стандартную выходную. Но это не удается, когда я хочу записать журнал в файл. Журнал записывается как на стандартный вывод, так и в файл.

Итак, я пробовал использовать следующий код, но это также не сработало.

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

Может кто-нибудь мне помочь в решении этой проблемы?

[EDIT]

OK. Думаю, я решил проблему. Я добавил строку 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? Попробуйте показать все Appenders: попробуйте использовать Logger.getAllAppenders() и покажите свои классы.

Вы также можете посмотреть в файлах log4j.properties и log4j.xml.

+0

Если я использую logger.getAllAppenders(), он показывает только одно приложение, которое является FileAppender. Если я использую Logger.getRootLogger(). GetAllAppenders(), он показывает только одно приложение, которое является ConsoleAppender. – jyotesh

+0

В любом случае, я нашел решение, которое я написал как изменение в моем вопросе. Спасибо за вашу помощь. – jyotesh

Смежные вопросы