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

Log4J2混合异步和同步记录器

林玮
2023-03-14

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

是否有一种方法可以创建另一个记录程序来捕获所有事件?还有别的想法吗?

下面是我的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个答案

袁山
2023-03-14

我想你已经解决了大部分问题。在我看来,你有三种选择:

  1. 创建同步根,并使除内存中的附加器外的所有附加器都是异步的。
  2. 使用您现在拥有的配置,包括一个异步根和一个命名的同步记录器。可加性意味着命名的记录器将接收所有事件。此选项假定所有组件都在“lqm”命名空间中。
  3. 我看到的最后一个选项是使所有记录器都是异步的,并更改内存中捕获的日志消息的接收方,使其能够处理异步回调。你的问题的措辞似乎你已经拒绝了这个选项,但你没有说为什么。然而,这一选项可能需要重大的重新设计,而且可能是最复杂的。此外,如果日志事件的数量足够小,您可以将它们全部存储在内存中,那么异步附加程序(选项1)的性能可能就足够了……
 类似资料:
  • 使用log4j2,我很难让同步记录器和异步记录器一起工作。 从这里以Apache文档(标题为混合同步和异步记录器)为例,运行下面的应用程序将简单地创建日志文件,但不向其写入任何内容。我也不确定添加两个记录器指向同一个appender,但它的Apache留档,所以我假设这是好的。 LOG4J2配置 pom.xml 应用 但是,如果我更改log4j2配置并修改loggers元素以读取以下内容,我将在日

  • 基于https://logging.apache.org/log4j/2.x/manual/async.html我想使用混合同步和异步记录器的方法,以便从所有同步记录器的性能改进中获益。 基准代码: Log4j2配置正是文档中的配置(https://logging.apache.org/log4j/2.x/manual/async.html): 使用这种混合的同步/异步记录器配置,我可以每秒获得大

  • 我最近升级了我的应用程序以使用log4j2。我正在尝试利用它的异步记录器特性。然而,看起来它并没有创建一个。根据Log4j异步配置,它说, 要使所有记录器都是异步的,请将中断器jar添加到类路径中,并将系统属性Log4jContextSelector设置为org.apache.logging.log4j.core.async.AsyncloggerContextSelector。我还设置了log4

  • 在这个msdn页面上,我读到: 应用程序不能为特定请求混合同步和异步方法。如果调用BeginGetRequestStream方法,则必须使用BeginGetResponse方法检索响应。 反之亦然吗?如果调用异步读取响应,是否还应该使用编写请求? 我的请求很小(100-1000个字符),响应可以很大。Jeffrey Richter的这篇文章似乎是说,在小负载的情况下,它可以同步完成(并且不需要设置

  • 背景: 在log4j2中,当使用asyncappender时,您可以将记录器的参数“blocking”设置为false,以便丢弃溢出缓冲区大小的任何日志,而不会减慢主线程的速度。(请参见asyncAppender下的此处。)https://logging.apache.org/log4j/2.x/manual/appenders.html) 我正在将我们的应用程序升级到这里找到的辉煌的asyncL

  • 问题内容: 现在在我的应用程序中,某些时候我们正在将一些繁重的工作记录到日志文件中。 基本上仅用于日志记录,我们先创建可用数据的JSON,然后登录到Log文件。这是以JSON格式记录数据的业务要求。 现在从可用数据创建JSON,然后登录到FILE需要花费大量时间,并影响原始请求的返回时间。现在的想法是改善环境。 我们讨论的一件事是使用以下方法创建线程池 在我们的代码中,然后向其提交任务,该任务会将