【问题标题】:How do I override DefaultErrorHandler in a Log4j 2 Socket appender?如何在 Log4j 2 Socket appender 中覆盖 DefaultErrorHandler?
【发布时间】:2020-07-01 01:33:46
【问题描述】:

目前我在 XML 中定义的<Socket> 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>

我希望我可以添加一个子元素 &lt;handler class="com.mycompany.MyErrorHandler"&gt;,但我在 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    

【问题讨论】:

    标签: tomcat log4j tomcat7 log4j2


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。在我提交问题之前只有一个问题:错误处理程序应该用于我的套接字附加程序,还是用于写入 catalina.out 的控制台附加程序? catalina.out 的 appender 甚至可以自定义吗?
    • 错误处理程序可以应用于任何 Appender,包括 ConsoleAppender。
    • 对,但是我能阻止这个堆栈跟踪出现在 catalina.out 中吗?我只是想确定我要求的是正确的。
    • 另外,我看到了 Bugzilla,但没有看到 Jira。 tomcat.apache.org/bugreport.html
    • 如果您提供自己的错误处理程序,您应该能够修改错误消息的记录方式。您不应该查看 Tomcat 的错误报告过程来报告 Log4j 中的问题。见issues.apache.org/jira/projects/LOG4J2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多