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

Logstash log4j2(2.0.1)异步追加器errorRef用法,logstash,log4j2,Logstash,Log4j2,我们在应用程序中使用log4j2记录消息。目前,我们的log4j2配置使用异步Appender,然后引用套接字Appender(protocol=“tcp”)将日志写入远程日志存储服务器: <Socket name="logstash" host="logging" port="4560" protocol="tcp" > <LogStashJSONLayout> <PatternLayout pattern="%d{HH:mm:ss.

我们在应用程序中使用log4j2记录消息。目前,我们的log4j2配置使用异步Appender,然后引用套接字Appender(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服务器不可用的情况下包含回退回滚文件追加器,为了实现这一点,我们认为可以通过以下方式修改异步追加器:

  • 设置“阻塞=错误”
  • 设置'ignoreExceptions=“false”'
  • 设置“errorRef”以指向我们的回退回滚文件追加器
这是实现这一目标的明智方式吗?如果是这样,异步Appender的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服务器节点故意不可用的环境中部署应用程序时,我们会遇到一个错误:

2015-04-24 09:55:43688错误无法调用元素套接字的类org.apache.logging.log4j.core.appender.SocketAppender中的工厂方法。2015-04-24 09:55:43702追加器中的套接字返回了错误Null对象。2015-04-24 09:55:43707错误4月24日未配置名为logstash的追加器,2015年9:55:43 AM org.apache.catalina.core.StandardContext startInternal严重:ServletContainerInitializer处理javax.servlet.ServletException期间出错:未能在org.springframework.web.SpringServletContainerInitializer.onStartup实例化WebApplicationInitializer类(SpringServletContainerInitializer.java:160)在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5481)在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)在org.apache.catalina.core.ContainerBase.ContainerBase.java:877org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1081)org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:553)org.apache.catalina.startup.HostConfig.HostInvoke.check(HostConfig.java:1668)sun.reflect.GeneratedMethodAccessor532(未知源)位于com.sun.jmx.mbeanserver.JmxMBeanServer.invoke的com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(未知源)上(来源不明)org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1480)org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:709)org.apache.catalina.manager.ManagerServlet.doPut(ManagerServlet.java:450)javax.servlet.http.HttpServlet.service(HttpServlet.java:649)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)的javax.servlet.http.HttpServlet.service(HttpServlet.java:727)位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)的org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:612)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)位于org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)java.lang.Thread.run(未知源)的org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)由sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)的java.lang.ExceptionInInitializerError引起位于java.lang.reflect.Constructor.newInstance(未知源)的sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源),位于java.lang.Class.newInstance(未知源),位于org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:157)…另外42个原因是:org.apache.logging.log4j.core.appender.AsyncAppender.start(AsyncAppender.java:108)org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:157)org.apache.logging.log4j.core.LoggerContext.s的java.start(AsyncAppender.java:108)
    <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>
<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>