Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在Log4j2中实现TcpSocketServer_Java_Spring Boot_Logging_Log4j2 - Fatal编程技术网

Java 无法在Log4j2中实现TcpSocketServer

Java 无法在Log4j2中实现TcpSocketServer,java,spring-boot,logging,log4j2,Java,Spring Boot,Logging,Log4j2,我正在尝试使用Log4j2将SpringBoot应用程序中的日志写入远程服务器。首先,我运行侦听器应用程序(也是一个spring启动应用程序),在那里我实现了,然后运行我的主应用程序。我得到了以下错误。主应用程序在localhost:8080上运行,侦听器应用程序在localhost:9600上运行 我这样做对吗?如何正确实现此日志记录?我在网上找不到合适的例子 在侦听器应用程序中 主要应用 我的实施 主应用程序中的Log4j2配置 侦听器应用程序中的Log4j2配置 侦听器应用程序中的

我正在尝试使用Log4j2将SpringBoot应用程序中的日志写入远程服务器。首先,我运行侦听器应用程序(也是一个spring启动应用程序),在那里我实现了,然后运行我的主应用程序。我得到了以下错误。主应用程序在localhost:8080上运行,侦听器应用程序在localhost:9600上运行

我这样做对吗?如何正确实现此日志记录?我在网上找不到合适的例子

在侦听器应用程序中

主要应用

我的实施

主应用程序中的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>