当前位置: 首页 > 知识库问答 >
问题:

使用AsyncAppender时,log4j重复消息

宗政永望
2023-03-14

我正在写一个应用程序,它使用log4j2.5,一切都很好。为了提高性能,我想使记录器异步,但不想添加中断器依赖项,所以我决定使用异步附加器。我找到了一些如何使用它们的示例,但我猜在使用过程中出现了一些问题:(

我没有使用xml配置文件,而是在代码中创建所有记录器。我要做的是首先创建我的appender,然后在引用它们名称的地方为它们中的每一个创建异步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创建一个AsyncAppender。

重复日志的示例:

2017-01-26 13:21:33619[Executor task launch worker-1]信息短文本-开始标记ID 973376

2017-01-26 13:21:33,619[执行任务启动工人-2]INFO短文本-开始标记ID 2497995

2017-01-26 13:21:33619[Executor task launch worker-1]信息短文本-开始标记ID 973376

2017-01-26 13:21:33,619[执行任务启动工人-2]INFO短文本-开始标记ID 2497995

共有1个答案

计光赫
2023-03-14

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

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

至于编程配置,一些Log4j2测试正在做与您试图做的类似的事情。例如这个:

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);

我希望这是有用的。

 类似资料:
  • 我使用Lombok@log4j在我的类中进行日志记录: 在此配置下,我只有一个日志记录: 我使用的是SpringBoot,而我的Application.Properties没有与日志级别相关的操作能力。 我已经尝试了此属性,但没有结果:

  • 在我们的spring boot应用程序中,我们注意到Kafka消费者偶尔会在prod env中随机消费两次消息。我们在PCF中部署了6个实例和6个分区。我们发现在同一主题中收到两次具有相同偏移量和分区的消息,这会导致重复,对我们来说是业务关键。我们在非生产环境中没有注意到这一点,在非生产环境中很难复制。我们最近转向Kafka,但我们无法找到根本问题。 我们使用的是spring cloud stre

  • 我担心如果在logging.properties中使用相同的文件,log4j和logging.properties可能会导致性能和正确性问题。否则,我将需要为那些不希望在我的情况下创建不同的文件。有没有干净的方法

  • 我在线程“main”java中遇到错误异常。lang.ExceptionInInitializerError引起的错误:org。阿帕奇。登录中。log4j。果心配置。ConfigurationException:从log4j1迁移时,没有可用于AsyncAppender ASYNC的appender。x到log4j 2。x使用Log4j 1。x桥根据https://logging.apache.o

  • 由于某些原因,我得到以下日志错误。在做了一些研究和之前文章中的一些评论之后,我创建了一个log4j文件,但它仍然不起作用。非常感谢您的帮助。

  • 我得到以下错误: 错误状态记录器Log4j2找不到日志记录实现。请将log4j核心添加到类路径。使用SimpleLogger登录到控制台。 我正在使用EclipseV4。3.2在GWT应用中。log4j-api-2.4.1。jar和log4j-core-2.4.1。jar位于类路径上。 我见过其他类似于我的错误的帖子,但我不清楚我做错了什么。 谢啦