【发布时间】:2020-05-04 21:31:48
【问题描述】:
背景 我将 log4j2(2.12.1) 与同步根和异步记录器一起使用。 Lmax 环形缓冲区大小默认为 256*1024。我在控制台中的附加程序。我正在使用 JSON 布局记录 MapMessage。我的日志消息的平均大小约为 100 字节。
通过以上详细信息,我注意到很少有线程被阻塞
"http-nio-8080-exec-172" #451
Thread State: BLOCKED (on object monitor) owned by "http-nio-8080-exec-148" Id=429
at org.apache.logging.log4j.core.appender.OutputStreamManager.write(OutputStreamManager.java:231)
- blocked on <0x000000003eb936ae> (a org.apache.logging.log4j.core.appender.OutputStreamManager)
at org.apache.logging.log4j.core.appender.OutputStreamManager.writeBytes(OutputStreamManager.java:206)
at org.apache.logging.log4j.core.layout.AbstractLayout.encode(AbstractLayout.java:211)
at org.apache.logging.log4j.core.layout.AbstractLayout.encode(AbstractLayout.java:37)
at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:197)
at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:190)
at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:181)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
at org.apache.logging.log4j.core.config.LoggerConfig.logParent(LoggerConfig.java:534)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:504)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
at org.apache.logging.log4j.core.async.AsyncLoggerConfig.log(AsyncLoggerConfig.java:121)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
at org.apache.logging.log4j.core.Logger.log(Logger.java:162)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2190)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2144)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2127)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1828)
at org.apache.logging.log4j.spi.AbstractLogger.info(AbstractLogger.java:1282)
我的问题是..
- Ring Buffer 是否快满了,这会导致主线程背压(在我的情况下,servlet 容器线程是 http-nio-8080-exec-148)?堆转储显示 RingBuffer 总是占用 7MB(测试前后)。
- 如果环形缓冲区快满了,我该如何增加它的大小?或者可能是丢弃事件??
- 查看 Log42 性能报告我知道不建议使用控制台附加程序,但我真的没有选择这里。这里有更好的写入 STDOUT 的附加程序吗?
感谢任何建议或想法。
【问题讨论】:
标签: java multithreading performance spring-boot log4j2