Java 无法在Log4j2中实现TcpSocketServer
我正在尝试使用Log4j2将SpringBoot应用程序中的日志写入远程服务器。首先,我运行侦听器应用程序(也是一个spring启动应用程序),在那里我实现了,然后运行我的主应用程序。我得到了以下错误。主应用程序在localhost:8080上运行,侦听器应用程序在localhost:9600上运行 我这样做对吗?如何正确实现此日志记录?我在网上找不到合适的例子 在侦听器应用程序中 主要应用 我的实施 主应用程序中的Log4j2配置Java 无法在Log4j2中实现TcpSocketServer,java,spring-boot,logging,log4j2,Java,Spring Boot,Logging,Log4j2,我正在尝试使用Log4j2将SpringBoot应用程序中的日志写入远程服务器。首先,我运行侦听器应用程序(也是一个spring启动应用程序),在那里我实现了,然后运行我的主应用程序。我得到了以下错误。主应用程序在localhost:8080上运行,侦听器应用程序在localhost:9600上运行 我这样做对吗?如何正确实现此日志记录?我在网上找不到合适的例子 在侦听器应用程序中 主要应用 我的实施 主应用程序中的Log4j2配置 侦听器应用程序中的Log4j2配置 侦听器应用程序中的
侦听器应用程序中的Log4j2配置
侦听器应用程序中的TcpSocketServer实现
包com.springReceiver.receiveFromSocket;
导入org.apache.logging.log4j.core.net.server.ObjectInputStreamLogEventBridge;
导入org.apache.logging.log4j.core.net.server.TcpSocketServer;
导入java.io.IOException;
导入java.io.ObjectInputStream;
类接收器{
无效写入日志(){
TcpSocketServer服务器=null;
试一试{
服务器=新的TcpSocketServer(9600,新的ObjectInputStreamLogEventBridge());
server.run();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
}
}
在客户端尝试以下配置:
<Socket name="socket" host="xxxxxxxxx" port="1090" connectTimeoutMillis="1000" reconnectionDelayMillis="1000" >
<SerializedLayout />
</Socket>
在客户端尝试以下配置:
<Socket name="socket" host="xxxxxxxxx" port="1090" connectTimeoutMillis="1000" reconnectionDelayMillis="1000" >
<SerializedLayout />
</Socket>
首先,您的tcp服务器似乎正在使用logging-log4j-tools中未经修改的代码,这是一个很好的理由。该代码期望发送的负载是Java序列化的LogEvent。但是代码没有对可以反序列化的对象执行任何白名单,这是一个安全漏洞(请参阅)
在客户端配置时切换到JSONLayout是一种更好的方法,但这意味着您的服务器必须将JSON转换回LogEvent,这也意味着您需要包含代码,以便能够重建正在传递的任何对象,否则它们将被视为映射。首先,您的TCPServer似乎正在使用logging-log4j-tools中未经修改的代码,这是一个很好的理由。该代码期望发送的负载是Java序列化的LogEvent。但是代码没有对可以反序列化的对象执行任何白名单,这是一个安全漏洞(请参阅)
与客户端配置一样切换到JSONLayout是一种更好的方法,但这意味着您的服务器必须将JSON转换回LogEvent,这也意味着您需要包含代码,以便能够重建正在传递的任何对象,否则它们将被视为映射。使用SerializedLayout而不将可反序列化的对象白名单是一个安全漏洞。使用SerializedLayout没有列出可以反序列化的对象,这是一个安全漏洞。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
<Appenders>
<Socket name="socket-appender" host="localhost" port="9600">
<JsonLayout properties="true"/>
</Socket>
</Appenders>
<Loggers>
<AsyncLogger name="socket-appender" level="info">
<AppenderRef ref="socket-appender"/>
</AsyncLogger>
<AsyncRoot level="info">
<AppenderRef ref="socket-appender"/>
</AsyncRoot>
</Loggers>
</Configuration>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" name="SocketServer">
<Appenders>
<RollingRandomAccessFile name="Rolling-Random-Access-File-Appender"
fileName="logs/rollingrandomaccessfile.log"
filePattern="archive/logs/rollingrandomaccessfile.log.%d{yyyy-MM-dd-hh-mm}.gz">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="1 KB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<AsyncLogger>
<AppenderRef ref="Rolling-Random-Access-File-Appender"/>
</AsyncLogger>
<AsyncRoot level="info">
<AppenderRef ref="Rolling-Random-Access-File-Appender"/>
</AsyncRoot>
</Loggers>
</Configuration>
package com.springReceiver.receiveFromSocket;
import org.apache.logging.log4j.core.net.server.ObjectInputStreamLogEventBridge;
import org.apache.logging.log4j.core.net.server.TcpSocketServer;
import java.io.IOException;
import java.io.ObjectInputStream;
class Receiver {
void writeLogs(){
TcpSocketServer<ObjectInputStream> server = null;
try {
server = new TcpSocketServer<>(9600,new ObjectInputStreamLogEventBridge());
server.run();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
<Socket name="socket" host="xxxxxxxxx" port="1090" connectTimeoutMillis="1000" reconnectionDelayMillis="1000" >
<SerializedLayout />
</Socket>