在 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 来双重确保)
- 有趣的是,它在随机时间发生在一些随机消息上。 一些消息被记录了更多 100 次。
请帮帮我