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

log4j2(2.0.1)异步追加器errorRef用法

涂选
2023-03-14

我们在应用程序中使用log4j2进行消息日志记录。当前,我们的log4j2配置使用异步附加器,然后引用套接字附加器(protocol=“TCP”)将日志写入远程日志存储服务器:

<Socket name="logstash" host="logging" port="4560" protocol="tcp" >
      <LogStashJSONLayout>

        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

        <KeyValuePair key="tomcat.host" value="${env:HOSTNAME}"/>
        <KeyValuePair key="tomcat.port" value="${env:CONNECTOR_PORT}"/>
        <KeyValuePair key="tomcat.service" value="${web:contextPath}"/>
      </LogStashJSONLayout>       
    </Socket>

    <Async name="async">
        <AppenderRef ref="logstash"/>
    </Async>

我们现在要做的是修改我们的log4j2配置,以便在Logstash服务器不可用的情况下包含一个回退RollingFile附加器,为了实现这一点,我们考虑通过以下方式修改异步附加器:

    null

这是一个明智的方法吗?如果是的话,异步附加器的XML是什么样子的?我们尝试了以下操作:

    <RollingFile name="fallbackFile"
        fileName="${sys:catalina.base}/logs/${web:contextPath}-fallback.log" 
        filePattern="${sys:catalina.base}/logs/${web:contextPath}-%d{dd-MMM-yyyy}-%i.log"
        append="true">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <Policies>
            <SizeBasedTriggeringPolicy size="1 GB" />
        </Policies>
    </RollingFile>

    <Socket name="logstash" host="logging" port="4560" protocol="tcp" >
      <LogStashJSONLayout>
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <KeyValuePair key="tomcat.host" value="${env:HOSTNAME}"/>
        <KeyValuePair key="tomcat.port" value="${env:CONNECTOR_PORT}"/>
        <KeyValuePair key="tomcat.service" value="${web:contextPath}"/>
      </LogStashJSONLayout>       
    </Socket>       

    <Async name="async" blocking="false" ignoreExceptions="false" errorRef="fallbackFile">
        <AppenderRef ref="logstash"/>           
    </Async>

但在Logstash服务器节点故意不可用的环境中部署应用程序时,我们会遇到一个错误:

我们做错了什么?我们是否应该使用故障转移附加器呢?

现在,为了使fallbackFile附加器在两种情况下都能工作(服务不可用和主机未知),我在我们的SocketAppender上包含了一个故障转移附加器:

    <RollingFile name="fallbackFile"
        fileName="${sys:catalina.base}/logs/${web:contextPath}-fallback.log" 
        filePattern="${sys:catalina.base}/logs/${web:contextPath}-%d{dd-MMM-yyyy}-%i.log"
        append="true">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <Policies>
            <SizeBasedTriggeringPolicy size="1 GB" />
        </Policies>
    </RollingFile>

    <Socket name="logstash" host="logging" port="4560" protocol="tcp" >
      <LogStashJSONLayout>
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        <KeyValuePair key="tomcat.host" value="${env:HOSTNAME}"/>
        <KeyValuePair key="tomcat.port" value="${env:CONNECTOR_PORT}"/>
        <KeyValuePair key="tomcat.service" value="${web:contextPath}"/>
      </LogStashJSONLayout>       
    </Socket>       

    <Failover name="failover" primary="logstash">
        <Failovers>
            <AppenderRef ref="fallbackFile"/>
        </Failovers>
    </Failover>

    <Async name="async" bufferSize="10" blocking="false" ignoreExceptions="false" errorRef="fallbackFile">
        <AppenderRef ref="failover"/>
    </Async>

这种配置似乎给我们提供了我们想要的行为。

任何更干净/更整洁的解决方案,甚至对此配置的评论将是最受欢迎的。

共有1个答案

艾心远
2023-03-14

logstash-gelf比log4j2的socketappender更有弹性。AsyncAppenders可以在一定程度上保护应用程序,但您仍然可能遇到TCP问题,如服务不可用、速度慢或连接/重新连接消耗时间。

GELF在UDP上工作,因此如果服务关闭/无法访问,它不会以任何方式影响应用程序的性能。唯一可能发生的情况是您可能丢失日志事件,但您已经为这种情况提供了文件回退。

logstash-gelf的配置的完整示例如下所示:

<Configuration>
    <Appenders>
        <Gelf name="gelf" host="udp:localhost" port="12201" version="1.1" extractStackTrace="true"
              filterStackTrace="true" mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192"
              originHost="%host{fqdn}">
            <Field name="timestamp" pattern="%d{dd MMM yyyy HH:mm:ss,SSS}" />
            <Field name="level" pattern="%level" />
            <Field name="simpleClassName" pattern="%C{1}" />
            <Field name="className" pattern="%C" />
            <Field name="server" pattern="%host" />
            <Field name="server.fqdn" pattern="%host{fqdn}" />

            <!-- This is a static field -->
            <Field name="fieldName2" literal="fieldValue2" />

            <!-- This is a field using MDC -->
            <Field name="mdcField2" mdc="mdcField2" /> 
            <DynamicMdcFields regex="mdc.*" />
            <DynamicMdcFields regex="(mdc|MDC)fields" />
        </Gelf>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="gelf" />
        </Root>
    </Loggers>
</Configuration>  

完整文档可在以下网址获得:http://logging.paluch.biz/

 类似资料:
  • 这是我的log4j2.xml 我想实现每小时滚动的每日滚动文件,到目前为止,我还没有能够产生适当格式的日志,正如我所记得的,间隔参数似乎是按天而不是按小时递增。 我想实现这一点: 路由器。日志-- 路由器。日志2014-06-20-00 路由器。日志2014-06-20-01 ... 路由器。日志2014-06-20-23 路由器。日志2014-06-21-00 ... 相反,我做到了这一点: r

  • 我正在尝试通过代码添加一个自定义的附加器,该附加器应该记录一些包。所有的工作都使用以下代码: 所以简而言之..正如您所看到的,如果之前没有定义追加器,我正在创建一个追加器。然后我为org.test创建一个记录器(如果没有添加的话),并将appender添加到这个记录器中。 多谢了。

  • Log4j2 RollingFile追加冲突 下面是我们的log4j2配置文件的简化调试版本(我们每晚滚动,而不是每分钟滚动!)。 这个配置,而不是每分钟创建一个滚动文件 (根据TimeBasedTriggeringPolicy),将创建一个滚动文件(非tarred),包含JSON格式的日志记录,每20KB将被覆盖 (尽管它最终将略大于20KB(参见屏幕截图)。 我们还会得到以下错误(缩写为“..

  • 我正在尝试设置log4j2以使用异步记录器将所有消息记录到滚动文件中。 是否有一种方法可以创建另一个记录程序来捕获所有事件?还有别的想法吗? 下面是我的log4j2.xml:

  • 我正在使用lombok的log4j2记录器,需要基于ThreadContext映射配置路由附加器。路由键由脚本确定。这是整个log4j2。xml配置文件: 但是,我得到以下错误: Log4j2留档给了我们一个类似的脚本示例,它不适用于我的以太。我对JS相当陌生,但此代码似乎是一个有效的脚本。我是不是做错了什么? 提前谢谢。

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