gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:11:09 25 4
gpt4 key购买 nike

在 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 次。

请帮帮我

最佳答案

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

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

关于java - 一些消息在 log4j 多线程应用程序中被多次记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19901140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com