一些消息在log4j多线程应用程序中多次记录

时间:2013-11-11 07:39:16

标签: java multithreading log4j

在JAVA中,假设我有一个使用log4j的多线程应用程序,并且有超过1000个线程t1,t2,t3等等,运行并调用相同的日志记录函数传递消息和线程ID,例如log .info(“信息消息”)。

这是Filelogger类:

public class FileLogger
{
 private static ConcurrentHashMap<String, AnalyticsLogger> hmap = new ConcurrentHashMap<String, AnalyticsLogger>();
    private static final String DELIM = "|";

    public static class AnalyticsLogger
    {
        private Logger logger;
        private AnalyticsLogger(String name)
        {
            logger = Logger.getLogger(name);
            logger.setAdditivity(false);
        }

        public void stat(String tag, Object map)
        {
            logger.info(tag.toString() + DELIM + map.toString());
        }
    }

    public static AnalyticsLogger getFileLogger(String loggerName)
    {
        AnalyticsLogger aLogger = hmap.get(loggerName);
        if(aLogger == null) {
            hmap.putIfAbsent(loggerName, new AnalyticsLogger(loggerName));
            aLogger = hmap.get(loggerName);
        }
        return aLogger;
    }

}

实例创建:

//creating object
private static AnalyticsLogger analyticsLogger = FileLogger.getFileLogger("1");
//calling method
analyticsLogger.stat(tag, obj.toJSONString());

注意: 1.我使用并发hashmap来确保应该只有一个特定记录器的实例,所以整个日志消息都会转到一个地方。 (虽然我认为Logger.getLogger()是线程安全的,但仍然使用hashmap来保证双重确认)

  1. 有趣的是,随机时间会发生一些随机消息。 一些消息记录甚至更多100次。
  2. 请帮帮我

1 个答案:

答案 0 :(得分:0)

必须同步Log4J,否则您会在文件中看到交错和乱码的日志消息。但至少在Logback中只有appender被同步,而不是整个日志消息(所以计算有效的日志级别,日志消息等是多线程的)。

您可能还对AsyncAppender感兴趣,可以在一个不同的线程中对日志记录消息进行排队。