Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打印两次控制台消息_Java_Log4j - Fatal编程技术网

Java 打印两次控制台消息

Java 打印两次控制台消息,java,log4j,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 append

我创建了这个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);
    }
但由于某些原因,控制台消息会打印两次。你能帮我解决这个问题吗


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

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


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

您是否在没有控制台附加器的情况下获得控制台输出?是的,我删除了
fa.setAppend(true)但我仍然看到两次消息。不是那个。注释掉这个调用:
Logger.getRootLogger().addAppender(控制台)
fa.setAppend(true)只意味着程序启动时日志文件不会被截断。它不是你应该观察的地方,我删除了
Logger.getRootLogger().addAppender(控制台)现在消息没有打印。请告诉我如何编辑代码,好吗?在控制台布局中添加一个
[%c]
,然后将程序输出发布到某个地方,在
org.apache.log4j.Category#addAppender
上放置一个断点,并查看顶部框架。或者,在您发布的代码中只使用
log.setAdditivity(false)
,这是什么意思?我用上网本?顺便说一下,这是一个OSGI应用程序,我不能在IDE中测试它。我在OSGI框架上启动应用程序。每个JVM都可以用调试器启动。。。无论如何,关闭additivity应该可以修复双重消息,因为您在调试应用程序时遇到了问题,并且无法为我们提供可复制的测试程序