打印两次控制台消息

时间:2015-08-31 20:34:05

标签: java log4j

我创建了这个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);
    }

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

我认为配置不正确,但我无法找到错误。

1 个答案:

答案 0 :(得分:1)

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

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