首页 > 解决方案 > 如何在 Log4j 2 Socket appender 中覆盖 DefaultErrorHandler?

问题描述

目前我<Socket>在 XML 中定义的 appender 使用org.apache.logging.log4j.core.appender.DefaultErrorHandler,但它会打印一些我不想出现在catalina.out.

log4j2.xml

这是我目前拥有的:

<Appenders>
    <Socket name="socketLoggerAdapter" host="my-server" port="4006" protocol="UDP" reconnectionDelayMillis="60000">
        <JsonLayout properties="true"/>
    </Socket>
...
<Appenders>

我希望我可以添加一个子元素<handler class="com.mycompany.MyErrorHandler">,但我在 Log4j 2 文档中找不到任何解决此用例的内容。

有人可以向我指出一些文档或提供有关如何实现此功能的基本步骤吗?

我想压制什么

catalina.out在tomcat启动期间偶尔会记录这个,我不希望它被报告:

2020-06-30 18:12:38,238 AsyncAppender-myAppenderRef-socketAppender ERROR An exception occurred processing Appender socketAppender org.apache.logging.log4j.core.appender.AppenderLoggingException: Error flushing stream UDP:myserver:9006
    at org.apache.logging.log4j.core.appender.OutputStreamManager.flush(OutputStreamManager.java:176)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:107)
    at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:165)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:138)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:129)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:97)
    at com.mycompany.MyCustomAppender$AsyncThread.callAppender(MyCustomAppender.java:455)
    at com.mycompany.MyCustomAppender$AsyncThread.run(MyCustomAppender.java:398)
Caused by: java.io.IOException: Message too long
    ... 8 more

其他信息

以下是错误处理程序的初始化方式:

org.apache.logging.log4j.core.appender.DefaultErrorHandler.<init>(org.apache.logging.log4j.core.Appender) line: 47  
org.apache.logging.log4j.core.appender.ConsoleAppender(org.apache.logging.log4j.core.appender.AbstractAppender).<init>(java.lang.String, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, boolean) line: 40  
org.apache.logging.log4j.core.appender.ConsoleAppender(org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender<M>).<init>(java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, boolean, boolean, M) line: 60   
org.apache.logging.log4j.core.appender.ConsoleAppender.<init>(java.lang.String, org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>, org.apache.logging.log4j.core.Filter, org.apache.logging.log4j.core.appender.OutputStreamManager, boolean) line: 69   
org.apache.logging.log4j.core.appender.ConsoleAppender.createDefaultAppenderForLayout(org.apache.logging.log4j.core.Layout<? extends java.io.Serializable>) line: 106   
org.apache.logging.log4j.core.config.DefaultConfiguration.<init>() line: 62 
org.apache.logging.log4j.core.LoggerContext.<init>(java.lang.String, java.lang.Object, java.net.URI) line: 75   
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(java.lang.ClassLoader, java.net.URI) line: 145  
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean, java.net.URI) line: 70   
org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean) line: 57 
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) line: 141 
org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) line: 41  
org.apache.logging.log4j.LogManager.getContext(java.lang.ClassLoader, boolean) line: 185    
org.apache.logging.slf4j.Log4jLoggerFactory(org.apache.logging.log4j.spi.AbstractLoggerAdapter<L>).getContext(java.lang.Class<?>) line: 103 
org.apache.logging.slf4j.Log4jLoggerFactory.getContext() line: 43   
org.apache.logging.slf4j.Log4jLoggerFactory(org.apache.logging.log4j.spi.AbstractLoggerAdapter<L>).getLogger(java.lang.String) line: 42 
org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(java.lang.String) line: 29    
org.slf4j.LoggerFactory.getLogger(java.lang.String) line: 358   
org.apache.log4j.Logger(org.apache.log4j.Category).<init>(java.lang.String) line: 57    
org.apache.log4j.Logger.<init>(java.lang.String) line: 37   
org.apache.log4j.Log4jLoggerFactory.getLogger(java.lang.String) line: 43    
org.apache.log4j.Logger.getLogger(java.lang.String) line: 41    
org.apache.log4j.Logger.getLogger(java.lang.Class) line: 49 
com.mycompany.core.security.SessionUtil.<clinit>() line: 24 
com.mycompany.MyCompanyContextLoaderListener.contextInitialized(javax.servlet.ServletContextEvent) line: 14 
org.apache.catalina.core.StandardContext.listenerStart() line: 4812 
org.apache.catalina.core.StandardContext.startInternal() line: 5255 
org.apache.catalina.core.StandardContext(org.apache.catalina.util.LifecycleBase).start() line: 150  
org.apache.catalina.core.StandardHost(org.apache.catalina.core.ContainerBase).addChildInternal(org.apache.catalina.Container) line: 725 
org.apache.catalina.core.StandardHost(org.apache.catalina.core.ContainerBase).addChild(org.apache.catalina.Container) line: 701 
org.apache.catalina.core.StandardHost.addChild(org.apache.catalina.Container) line: 717 
org.apache.catalina.startup.HostConfig.deployWAR(org.apache.catalina.util.ContextName, java.io.File) line: 945  
org.apache.catalina.startup.HostConfig$DeployWar.run() line: 1795   
java.util.concurrent.Executors$RunnableAdapter<T>.call() line: 471  
java.util.concurrent.FutureTask<V>.run() line: 262  
java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) line: 1145    
java.util.concurrent.ThreadPoolExecutor$Worker.run() line: 615  
java.lang.Thread.run() line: 745    

标签: tomcatlog4jtomcat7log4j2

解决方案


我相信最近有另一个关于此的 Stackoverflow 问题。这是我的疏忽,您应该为此创建一个 Jira 问题。虽然您可以调用 setErrorHandler 方法来更改 ErrorHandler,但无法配置一个,因为它没有被初始化为插件。


推荐阅读