通过LogEvent Object通过SocketAppender提取日志

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

所以这是我的配置文件或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

LogSender

它的工作是通过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");
    }
}

LogListener

这应该接收通过流发送的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();
    }

产量

原子

DEBUG

错误2

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

我也想要所有其他级别。我将如何继续这样做?

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

java object logging log4j2
1个回答
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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.