2015-08-31 142 views
2

我创造了这个Java代码来配置Log4j打印两次控制台消息

public class LogMessages 
{ 
    private final Logger log; 

    public LogMessages(Configuration cv) 
    { 
     log = Logger.getLogger(LogMessages.class); 

     ConsoleAppender console = new ConsoleAppender(); //create appender 
     // configure the appender 
     console.setLayout(new PatternLayout("%d{dd/MM/yyyy HH:mm:ss} %m%n")); // Set output format for the console messages 

     String consoleLoggingLevel = cv.getConsoleLoggingLevel(); 

     if ("DEBUG".equalsIgnoreCase(consoleLoggingLevel)) 
     { 
      console.setThreshold(Level.DEBUG); 
     } 
     else if ("INFO".equalsIgnoreCase(consoleLoggingLevel)) 
     { 
      console.setThreshold(Level.INFO); 
     } 
     else if ("WARN".equalsIgnoreCase(consoleLoggingLevel)) 
     { 
      console.setThreshold(Level.WARN); 
     } 
     else if ("ERROR".equalsIgnoreCase(consoleLoggingLevel)) 
     { 
      console.setThreshold(Level.ERROR); 
     } 
     else if ("FATAL".equalsIgnoreCase(consoleLoggingLevel)) 
     { 
      console.setThreshold(Level.FATAL); 
     } 
     else if ("OFF".equalsIgnoreCase(consoleLoggingLevel)) 
     { 
      console.setThreshold(Level.OFF); 
     } 

     console.activateOptions(); 

     Logger.getRootLogger().addAppender(console); 

     DailyRollingFileAppender fa = new DailyRollingFileAppender(); 
     fa.setName("FileLogger"); 
     fa.setFile("log" + File.separator + "messages.log"); 
     fa.setDatePattern("'.'yyyy-MM-dd"); 
     fa.setLayout(new PatternLayout("%d{dd/MM/yyyy HH:mm:ss} %m%n")); // Set output format for the file logging 

     String fileLoggingLevel = cv.getFileLoggingLevel(); 

     if ("DEBUG".equalsIgnoreCase(fileLoggingLevel)) 
     { 
      fa.setThreshold(Level.DEBUG); 
     } 
     else if ("INFO".equalsIgnoreCase(fileLoggingLevel)) 
     { 
      fa.setThreshold(Level.INFO); 
     } 
     else if ("WARN".equalsIgnoreCase(fileLoggingLevel)) 
     { 
      fa.setThreshold(Level.WARN); 
     } 
     else if ("ERROR".equalsIgnoreCase(fileLoggingLevel)) 
     { 
      fa.setThreshold(Level.ERROR); 
     } 
     else if ("FATAL".equalsIgnoreCase(fileLoggingLevel)) 
     { 
      fa.setThreshold(Level.FATAL); 
     } 
     else if ("OFF".equalsIgnoreCase(fileLoggingLevel)) 
     { 
      fa.setThreshold(Level.OFF); 
     } 

     fa.setAppend(true); 
     fa.activateOptions(); 

     // add appender to any Logger 
     Logger.getRootLogger().addAppender(fa); 
    } 

但由于某些原因被打印两次控制台消息。你能帮我解决这个问题吗?

我想配置不正确,但我找不到我的错误。

+0

你没有控制台appender获得控制台输出吗? – bvj

+0

是的,我删除了'fa.setAppend(true);'但我仍然看到消息两次。 –

+0

不是那个。注释掉这个调用:'Logger.getRootLogger()。addAppender(console);' – bvj

回答

1

当您看到相同的日志消息两次或更多次时,这是因为您有两个或更多记录器写入相同的appender。要么禁用子记录器的可加性,要么确定记录器并删除不需要的appender。

要标识记录器,您可以在消息(%c)中打印记录器名称,也可以在log4j代码中设置断点。

+0

你能告诉我怎样编辑代码吗? –

+0

将'[%c]'添加到控制台布局并将程序输出发布到某处 – Raffaele

+0

http://pastebin.com/GVMcpxtt我使用Log4J类作为服务。 –