在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来保证双重确认)
请帮帮我
答案 0 :(得分:0)
必须同步Log4J,否则您会在文件中看到交错和乱码的日志消息。但至少在Logback中只有appender被同步,而不是整个日志消息(所以计算有效的日志级别,日志消息等是多线程的)。
您可能还对AsyncAppender感兴趣,可以在一个不同的线程中对日志记录消息进行排队。