【问题标题】:Log4j2 Socket Appender "connect java.net.ConnectException: Connection refused: connect"Log4j2 Socket Appender“连接 java.net.ConnectException:连接被拒绝:连接”
【发布时间】:2016-12-16 13:13:58
【问题描述】:

我正在尝试将新的 log4j2 与 Socket Appender 一起使用,但我有点不走运。 这是我的 XML 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
        <Socket name="socket" host="localhost" port="9600">
            <SerializedLayout />
        </Socket>
      </Appenders>
  <Loggers>
    <Logger name="com.mycorp" level="info" />
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="socket"/>
        </Root>
  </Loggers>
</Configuration>

这是我的 Java 代码:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import java.io.*;
import java.sql.SQLException;
import org.apache.logging.log4j.core.net.*;

public class SyslogLogger
{
    private static final Logger LOG = LogManager.getLogger(SyslogLogger.class);

    public static void main (String[] args)throws IOException,SQLException
    {
        LOG.info("commit(). Query {}", "commit(). Query {}");
    }
}

执行我得到的代码时:

2016-06-29 17:13:42,426 main ERROR Unable to write to stream TCP:127.0.0.1:9600 for appender socket: org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to TCP:127.0.0.1:9600 socket not available
2016-06-29 17:13:42,426 main ERROR An exception occurred processing Appender socket org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to TCP:127.0.0.1:9600 socket not available

我应该显式地创建一个 TCP 套接字吗?还是 Log4j2 为我做的? 我看到了一些关于 Logstash 的帖子,这里需要吗? 请注意,我只是想发送消息,而不是此时实际捕获它们。 此外,我也遇到了与 Syslog Adapter 类似的问题。

【问题讨论】:

  • 9600 端口有监听吗?
  • @Fildor,不,有什么东西必须听才能发送吗?是否同样适用于使用 UDP 的 Syslog 或 SocketAppender?
  • UDP 是无连接且不可靠的。因此,您可以直接对着网络大喊大叫,而无需关心是否有人在听。但是 TCP 确保如果发送了某些东西,它也已经被接收到了,所以这是不同的。
  • “是否需要监听才能发送?' - 是的。当然。
  • @Fildor,好的,所以我已将其配置为使用 UDP,现在我没有收到任何错误,但wireshark 监控未检测到端口 9600 上的任何消息。所以我假设它们是未发送。

标签: java sockets log4j2


【解决方案1】:

您需要此客户端的服务器端,它将事件记录到套接字附加程序。 您的服务器端看起来像:

public static void main(String args[])
{
    TcpSocketServer server = null;
    try {
        server = new TcpSocketServer(9600,new ObjectInputStreamLogEventBridge());
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    server.run();
}

这里,一个 Tcp Socket 在 9600 上打开,只要此服务器运行,它就会一直监听日志事件。 您还需要与此服务器对应的 log4j2 配置。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyAppServer" packages="">
  <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console
  </Appenders>
  <Loggers>
     <Logger name="com.mycorp" level="info" />
        <Root level="info">
        <AppenderRef ref="Console"/>
        </Root>
  </Loggers>
</Configuration>

现在,com.mycorp 的子记录器写入的所有日志事件都将附加到运行服务器的控制台。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 2015-09-09
    • 2014-05-17
    • 2013-11-05
    • 2023-03-21
    • 2015-05-18
    • 2018-06-10
    • 2017-05-14
    相关资源
    最近更新 更多