使用AsyncAppender时log4j重复消息

时间:2017-01-29 11:07:00

标签: scala asynchronous log4j2

我正在编写一个使用log4j 2.5的应用程序,一切都运行良好。为了提高性能,我想让logger异步但不想添加disruptor依赖,所以我决定使用Async Appenders。我找到了一些如何使用它们的例子,但我猜这个过程出了问题:(

我没有使用xml配置文件,而是在代码中创建所有记录器。我正在做的是首先创建我的appender然后我为每一个创建Async Appender,我引用它们的名字。

我是否收到重复邮件,因为对于每个appender,我既有appender本身,也有AsyncAppender将我的邮件发送给该appender?

我的代码:

addAppenderToLogger(fileAppender, logger)
addAppenderToLogger(rollingFileAppender, logger)

AsyncAppender.createAppender(
  names.map(name => AppenderRef.createAppenderRef(
    name, Level.getLevel("INFO"), null
  )), errorRef, true, 0, 2048, s"async-appender", false, null, config, true
)

我正在为我的两个appender创建1个AsyncAppender。

重复日志的示例:

  

2017-01-26 13:21:33,619 [Executor task launch worker-1] INFO   短文 - 开始标记ID 973376

     

2017-01-26 13:21:33,619 [Executor task launch worker-2] INFO   短文 - 开始标记ID 2497995

     

2017-01-26 13:21:33,619 [Executor task launch worker-1] INFO   短文 - 开始标记ID 973376

     

2017-01-26 13:21:33,619 [Executor task launch worker-2] INFO   短文 - 开始标记ID 2497995

1 个答案:

答案 0 :(得分:1)

如果直接将FileAppender和AsyncAppender都添加到记录器中,那么这将成为瓶颈,您将失去异步记录的好处。

AsyncAppender添加到记录器中,让AsyncAppender通过AppenderRef指向FileAppender。

对于程序化配置,一些Log4j2测试正在做类似于您尝试的操作。例如this one

final LoggerContext context = LoggerContext.getContext(false);
final Configuration config = context.getConfiguration();
final PatternLayout layout = PatternLayout.createDefaultLayout(config);
final Appender appender = WriterAppender.createAppender(layout, null, writer, writerName, false, true);
appender.start();
config.addAppender(appender);

final Level level = null;
final Filter filter = null;
for (final LoggerConfig loggerConfig : config.getLoggers().values()) {
    loggerConfig.addAppender(appender, level, filter);
}
config.getRootLogger().addAppender(appender, level, filter);

我希望这很有用。