【问题标题】:java logging writing multiple times for each thread in polling systemjava记录为轮询系统中的每个线程多次写入
【发布时间】:2014-05-07 05:20:16
【问题描述】:

java中的线程轮询系统。我已经分别为每个线程包括了日志记录。但是fileappender的实例没有被线程关闭。因此,在下一次轮询中,当线程到来时,有两个 fileappender 实例,因此它记录了两次,在下一次轮询中再次记录了三次,依此类推...

这是我的代码

public void run()
{

    String parent = "Autobrs", name = "Pool";
    name = name + poolId;
    String loggerName = parent + "." + name;
    Logger log = Logger.getLogger(loggerName);

    DailyRollingFileAppender fileApp = new DailyRollingFileAppender();
    fileApp.setName("Autobrs." + loggerName + "_FileAppender");
    fileApp.setFile("c:\\java\\"+ name+".log");
    fileApp.setLayout(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss}  (%0F:%L) %3x - %m%n"));
    fileApp.setThreshold(Level.toLevel("debug"));
    fileApp.setAppend(true);
    fileApp.activateOptions();
    log.addAppender(fileApp);
}

我不知道如何处理。 请帮忙..

【问题讨论】:

  • 您似乎正在尝试使用 poolId 来分隔日志。我想每个线程都是一样的。

标签: java multithreading logging


【解决方案1】:

由于 FileAppender 从 Writeappender as stated here 继承 close(),所以使用

fileApp.close()

【讨论】:

  • 我之前已经尝试过了。记录很好(单次)。但它显示一个错误。 "log4j:ERROR Attempted to append to close appender named [Autobrs.Autobrs.Pool3448_FileAppender]。"
【解决方案2】:
String parent = "Autobrs", name = "Pool";
name = name + poolId;
String loggerName = parent + "." + name;
Logger log = Logger.getLogger(loggerName);

这里可能有内存泄漏。 Logger.getLogger() 将保留对其创建的所有记录器的引用。

最佳做法是让main 线程配置一个文件附加程序,并且每个run() 都可以在其消息中记录poolId(或其他)。

让多个线程写入一个通用的记录器和附加器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2015-03-20
    相关资源
    最近更新 更多