Log4J2混合异步和同步记录器

时间:2014-12-09 10:41:17

标签: log4j2

我尝试设置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>

1 个答案:

答案 0 :(得分:1)

我认为你已经完成了大部分工作。我认为你有三种选择:

  1. 创建同步根,并使除内存中的appender之外的所有appender异步。
  2. 使用您现在拥有的配置,使用异步根和单个命名同步记录器。可加性意味着命名的记录器将接收所有事件。此选项假定所有组件都在&#34; lqm&#34;命名空间。
  3. 我看到的最后一个选项是使所有记录器异步,并以可以处理异步回调的方式更改内存中捕获的日志消息的接收者。您的问题的措辞似乎已经拒绝了这个选项,但您不能说出原因。但是,此选项可能需要进行重大的重新设计,并且可能是最复杂的。此外,如果日志事件的数量足够小,您可以将它们全部存储在内存中,那么异步appender(选项1)的性能可能就足够了......