首页 文章

Log4J2混合异步和同步 Logger

提问于
浏览
2

我正在尝试设置log4j2以使用异步 Logger 将所有消息记录到滚动文件 .

另外,我正在使用我添加的自定义appender,它使我能够捕获到缓冲区的所有消息 . 此appender用于调试目的 . 它在特殊调试请求到达服务器时开始收集消息,它捕获所有消息,然后指示它停止收集消息,并将捕获的消息作为响应返回 .

这个自定义appender显然无法添加到异步 Logger ,因为那时我将无法在响应中返回调试消息(因为消息将被发送到另一个线程上的appender) .

问题是如何配置log4j以仅在同步模式下运行此自定义appender而其余部分在同步模式下运行 .

我将根 Logger 设置为异步并添加对所有文件 Logger 的引用,并为自定义appender添加另一个同步 Logger ,但是同步 Logger 需要一个名称,并且只记录来自继承该名称的 Logger 的消息 . 这不够好,因为我想捕获系统中的所有消息 .

我也可以创建一个同步 Logger 并使用异步appender但是我失去了使用disruptor库进行异步记录的能力,这看起来很有希望 .

有没有办法创建另一个捕获所有事件的 Logger ?还有其他想法吗?

这是我的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 回答

  • 1

    我想你已经完成了大部分工作 . 我看到它的方式有三个选择:

    • 创建同步根,并使除内存中的appender之外的所有appender异步 .

    • 使用您现在拥有的配置,使用异步根和单个命名同步 Logger . 可加性意味着命名的 Logger 将接收所有事件 . 此选项假定所有组件都在"lqm"命名空间中 .

    • 我看到的最后一个选项是使所有 Logger 异步,并以可以处理异步回调的方式更改内存中捕获的日志消息的接收者 . 您的问题的措辞似乎已经拒绝了这个选项,但您没有说明原因 . 但是,此选项可能需要进行重大的重新设计,并且可能是最复杂的 . 此外,如果日志事件的数量足够小,您可以将它们全部存储在内存中,那么异步appender(选项1)的性能可能就足够了......

相关问题