Log4j2 TcpSocketManager 垃圾邮件

问题描述 投票:0回答:1

我的 Log4j2 配置文件中设置了一个 TCP 套接字附加程序,但远程接收器可以定期离线。如果远程接收器已启动并正在运行,它工作正常,但当远程接收器离线时,它会启动控制台错误垃圾邮件。在我的设置中,如果远程接收器不可用,这是正常情况。

如果 TCP 远程接收器不可用,我如何配置 Log4j 以停止错误消息垃圾邮件?

log4j.xml的相关部分是:

        <Socket name="ROLLING_SOCKET" host="127.0.0.1" port="18585">
            <JsonLayout />
        </Socket>

错误垃圾邮件如下所示:

2023-04-11 18:50:37,152 main ERROR TcpSocketManager (TCP:127.0.0.1:18585) caught exception and will continue: java.io.IOException: Unable to create socket for 127.0.0.1 at port 18585
    at org.apache.logging.log4j.core.net.TcpSocketManager$TcpSocketManagerFactory.createSocket(TcpSocketManager.java:509)
    at org.apache.logging.log4j.core.net.TcpSocketManager$TcpSocketManagerFactory.createManager(TcpSocketManager.java:478)
    at org.apache.logging.log4j.core.net.TcpSocketManager$TcpSocketManagerFactory.createManager(TcpSocketManager.java:459)
    at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:114)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:100)
    at org.apache.logging.log4j.core.net.TcpSocketManager.getSocketManager(TcpSocketManager.java:202)
    at org.apache.logging.log4j.core.appender.SocketAppender.createSocketManager(SocketAppender.java:443)
    at org.apache.logging.log4j.core.appender.SocketAppender$Builder.build(SocketAppender.java:221)
    at org.apache.logging.log4j.core.appender.SocketAppender$Builder.build(SocketAppender.java:195)
    at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1120)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:1045)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:1037)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:651)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:247)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:293)
    at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:626)
    at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:699)
    at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:716)
    at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:270)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
    at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:599)
    at com.zzz.test.ServerModuleUnitTest.main(ServerModuleUnitTest.java:543)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.base/sun.nio.ch.Net.connect0(Native Method)
    at java.base/sun.nio.ch.Net.connect(Net.java:579)
    at java.base/sun.nio.ch.Net.connect(Net.java:568)
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
    at java.base/java.net.Socket.connect(Socket.java:633)
    at org.apache.logging.log4j.core.net.TcpSocketManager.createSocket(TcpSocketManager.java:409)
    at org.apache.logging.log4j.core.net.TcpSocketManager$TcpSocketManagerFactory.createSocket(TcpSocketManager.java:504)
    ... 27 more

2023-04-11 18:50:37,333 main ERROR Unable to write to stream TCP:127.0.0.1:18585 for appender ROLLING_SOCKET org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to TCP:127.0.0.1:18585: socket not available
    at org.apache.logging.log4j.core.net.TcpSocketManager.write(TcpSocketManager.java:214)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.write(OutputStreamManager.java:190)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.writeByteArrayToManager(AbstractOutputStreamAppender.java:206)
    at org.apache.logging.log4j.core.appender.SocketAppender.directEncodeEvent(SocketAppender.java:459)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:190)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:181)
    at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
    at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:542)
    at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:500)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:483)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417)
    at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
    at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
    at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2205)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2159)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2142)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2017)
    at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1983)
    at org.apache.logging.log4j.spi.AbstractLogger.warn(AbstractLogger.java:2661)
    at com.zzz.test.ServerModuleUnitTest.main(ServerModuleUnitTest.java:547)

2023-04-11 18:50:37,334 main ERROR An exception occurred processing Appender ROLLING_SOCKET org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to TCP:127.0.0.1:18585: socket not available
    at org.apache.logging.log4j.core.net.TcpSocketManager.write(TcpSocketManager.java:214)
    at org.apache.logging.log4j.core.appender.OutputStreamManager.write(OutputStreamManager.java:190)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.writeByteArrayToManager(AbstractOutputStreamAppender.java:206)
    at org.apache.logging.log4j.core.appender.SocketAppender.directEncodeEvent(SocketAppender.java:459)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:190)
    at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:181)
    at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
    at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:542)
    at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:500)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:483)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417)
    at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
    at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
    at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2205)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2159)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2142)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2017)
    at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1983)
    at org.apache.logging.log4j.spi.AbstractLogger.warn(AbstractLogger.java:2661)
    at com.zzz.test.ServerModuleUnitTest.main(ServerModuleUnitTest.java:547)

java log4j2
1个回答
0
投票

要在 TCP 远程接收器不可用时停止将错误消息打印到控制台,您可以将 Log4j2 配置的状态级别设置为更高级别,例如 ERROR 或 FATAL。这将防止打印 WARN 级别的消息。此外,您可以配置自定义 ErrorHandler 来静默处理此类异常。

以下是如何修改 Log4j2 配置的示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
    <Appenders>
        <Socket name="ROLLING_SOCKET" host="127.0.0.1" port="18585">
            <JsonLayout />
            <ErrorHandler type="com.example.MyCustomErrorHandler" />
        </Socket>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="ROLLING_SOCKET"/>
        </Root>
    </Loggers>
</Configuration>

在上面的配置中,Configuration元素的status属性被设置为error,以防止打印WARN级别的消息。

接下来,创建一个实现 Log4j 的 ErrorHandler 接口的自定义 ErrorHandler 类:

package com.example;

import org.apache.logging.log4j.core.ErrorHandler;
import org.apache.logging.log4j.core.LogEvent;

public class MyCustomErrorHandler implements ErrorHandler {

    @Override
    public void error(String msg) {
        // Ignore errors silently
    }

    @Override
    public void error(String msg, Throwable t) {
        // Ignore errors silently
    }

    @Override
    public void error(String msg, LogEvent event, Throwable t) {
        // Ignore errors silently
    }

    @Override
    public void setLoggerName(String name) {
        // No need to do anything here
    }

    @Override
    public void shutdown() {
        // No need to do anything here
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.