我尝试设置log4j2,使用异步记录器将所有消息记录到滚动文件中。
此外,我正在使用我添加的自定义appender,这使我能够捕获到缓冲区的所有消息。此appender用于调试目的。它会在特殊调试请求到达服务器时开始收集消息,它会捕获所有消息,然后指示它停止收集消息,并将捕获的消息作为响应返回。
这个自定义appender显然无法添加到异步记录器,因为那时我将无法在响应中返回调试消息(因为消息将被发送到另一个线程上的appender)。
问题是如何配置log4j以仅同步运行此自定义appender,其余为异步模式。
我将根记录器设置为异步并添加对所有文件记录器的引用,并为自定义appender添加另一个同步记录器,但是同步记录器需要一个名称,并且只记录来自继承该名称的记录器的消息。这是不够好的,因为我想要捕获系统中的所有消息。
我也可以创建一个同步记录器并使用异步appender但是我失去了使用disruptor库进行异步记录的能力,这看起来很有希望。
有没有办法创建另一个捕获所有事件的记录器? 还有其他想法吗?
这是我的log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="lqm.common.utils">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
</Console>
<RollingFile name="async_E" fileName="/var/log/ep/error.log" filePattern="/var/log/ep/error.log.%d{yyyy-MM-dd-HH}">
<PatternLayout pattern="%d [%t] %-5p %c [%X{username}] - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<RollingFile name="async_P" fileName="/var/log/ep/ep-async.log" filePattern="/var/log/ep/ep-async.log.%d{yyyy-MM-dd-HH}">
<PatternLayout pattern="%d [%t] %-5p %c [%X{username}] - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
<StringAppender name="imMem">
<PatternLayout pattern="%d [%t] %-5p %c [%X{username}] - %m%n"/>
</StringAppender>
</Appenders>
<Loggers>
<Logger name="lqm" level="trace">
<AppenderRef ref="imMem" />
</Logger>
<asyncRoot level="info">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="async_E" level="warn"/>
<AppenderRef ref="async_P" />
</asyncRoot>
</Loggers>
</Configuration>
答案 0 :(得分:1)
我认为你已经完成了大部分工作。我认为你有三种选择: