【问题标题】:Strange Double Logging in Singleton RunnableSingleton Runnable 中奇怪的双重日志记录
【发布时间】:2014-06-05 14:51:43
【问题描述】:

我有这个代码:

public enum Something {
    INSTANCE;

    private static final Logger LOGGER = LoggerFactory.getLogger(Something.class);

    private Something() {
        Thread testThread = new Thread(new Runnable() {
            @Override
            public void run() {
                // do something
                LOGGER.info("TESTTHREAD: This should only appear once!");
            }
        });
        testThread.setName("TestThread");
        testThread.start();
    }
}

当我跑步时

Something.INSTANCE.getClass();

记录的内容(具有完全相同的时间戳)是:

TESTTHREAD: This should only appear once!
TESTTHREAD: This should only appear once!

有没有人见过这样的事情,或者知道会发生什么?

【问题讨论】:

  • 是的,给我们看看你的配置。

标签: java multithreading logging singleton slf4j


【解决方案1】:

我认为您所看到的是附加程序可加性的结果。我假设您有一个带有appender-ref 的ROOT 记录器和一个带有appender-ref 的单独记录器(用于您的班级)。默认情况下会继承附加程序,因此通过您的子记录器发送的任何日志语句都将进入子程序的附加程序和父程序的附加程序。您要做的是通过将子记录器的additivity 属性设置为false 来禁用此功能。

【讨论】:

  • 就是这样!我有一个没有可加性属性的类的最重要的 logger appender - 谢谢!
【解决方案2】:

当我运行它时

import java.util.logging.Logger;

public class Main {
    enum Singleton {
        INSTANCE;

        private static final Logger LOGGER = Logger.getLogger(Singleton.class.getName());

        Singleton() {
            Thread testThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    LOGGER.info("Print only once");
                }
            });
            testThread.start();
        }
    }

    public static void main(String... ignored) {
        Singleton.INSTANCE.toString();
    }
}

我只会得到

Jun 05, 2014 10:03:08 AM Main$Singleton$1 run
INFO: Print only once

【讨论】:

  • 我正在使用 org.slf4j.Logger & org.slf4j.LoggerFactory
  • @mathematician 您可能还想指定哪个实现。回滚?
猜你喜欢
  • 2017-03-16
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多