【问题标题】:Extracting logs send over SocketAppender via LogEvent Object通过 LogEvent 对象提取通过 SocketAppender 发送的日志
【发布时间】:2017-12-21 16:12:34
【问题描述】:

所以这是我的配置文件或 log4j2.properties 文件

#Socket Appender
appender.socket.type=Socket
appender.socket.name=Socket_Appender
appender.socket.host=10.176.250.5
appender.socket.port=9000
appender.socket.layout.type=SerializedLayout
appender.socket.connectTimeoutMillis=2000
appender.socket.reconnectionDelayMillis=1000
appender.socket.protocol=TCP
#Loggers
logger.socket.name=atom
logger.socket.level=debug
logger.socket.appenderRefs=socket
logger.socket.appenderRef.socket.ref=Socket_Appender

接下来我有两个类 LogSender 和 LogListener

日志发送器

它的工作是通过 SocketAppender 发送日志。

通过 Stream 发送的是一个 LogEvent 对象。

public class LogSender {

public static final Logger LOG = LogManager.getLogger("atom");

public static void main(String[] args) {
    LOG.trace("Error 1");
    LOG.debug("Error 2");
    LOG.info("Error 3");
    LOG.warn("Error 4");
    LOG.error("Error 5");
    LOG.fatal("Error 6");
    }
}

日志监听器

这应该接收通过流发送的 LogEvent 对象。 LogListener 正在使用 ObjectInputStream 并保存

LogEvent event = null;
private Socket socket1 = null;
private ServerSocket ss = null;
PrintWriter sspw=null;
ObjectInputStream objectInputStream = null;
try {
//Creating Socket and making it listen to a specific port, receiving through streams.
//Servers socket creation and waiting
        ss = new ServerSocket(9000);
        socket1 = ss.accept();

        objectInputStream = new ObjectInputStream(new BufferedInputStream(socket1.getInputStream()));

        event = (LogEvent) objectInputStream.readObject();
        System.out.println(event.getLoggerName());
        System.out.println(event.getLevel());
        System.out.println(event.getMessage().getFormattedMessage());
        objectInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

输出

原子

调试

错误 2

Output 是预期的 Logger 的名称。这意味着我们正在接收一个 LogEvent 对象并能够提取记录器信息。我也能够收到实际的日志消息,但只弹出一个级别,即 DEBUG 级别。

我也想要所有其他级别。我该怎么做呢?

我对 Log4j2 很陌生,我觉得我在理解上错过了一些东西(只是一种直觉)。

【问题讨论】:

    标签: java object logging log4j2


    【解决方案1】:

    您没有获得第一个日志 (TRACE),因为在您的配置文件 log4j2.properties 中,您有 logger.socket.level=debug,但您应该有 logger.socket.level=trace 来启用级别 TRACE。

    关于其他日志,您应该循环运行您的侦听器代码:现在您只读取第一个日志。

    我没有测试这段代码,但它应该是这样的:

    LogEvent event = null;
    private Socket socket1 = null;
    private ServerSocket ss = null;
    PrintWriter sspw=null;
    ObjectInputStream objectInputStream = null;
    try {
            //Creating Socket and making it listen to a specific port, receiving through streams.
            //Servers socket creation and waiting
            ss = new ServerSocket(9000);
            socket1 = ss.accept();
    
            objectInputStream = new ObjectInputStream(new BufferedInputStream(socket1.getInputStream()));
    
            while (true) {  
                event = (LogEvent) objectInputStream.readObject();
                System.out.println(event.getLoggerName());
                System.out.println(event.getLevel());
                System.out.println(event.getMessage().getFormattedMessage());
            }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (objectInputStream != null) {
            objectInputStream.close();
        }
    }
    

    【讨论】:

    • 所以,是的,它有效,但我不明白如何。
    • 我最终得到了我不明白的 EOFException
    • 如果你在上面显示的代码中遇到了这个异常,那么这应该意味着对方(正在发送日志的应用程序)已经终止了连接(或者可能是双方之间的网络问题) .我想您可以将整个代码放在另一个循环中,以便在出现 EOFException 的情况下自动/定期重新连接
    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多