我正在编写一个使用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
答案 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);
我希望这很有用。