Java Log4j2 SecureTcpSocketServer设置

Java Log4j2 SecureTcpSocketServer设置,java,log4j2,Java,Log4j2,我正在尝试设置一个log4j2securetcpsocketserver,它将从远程应用程序接收日志(使用log4j2进行日志记录)。我已经使用TcpSocketServer创建了原型,它可以通过提供端口号和配置文件从命令行运行。但是,SecureTcpSocketServer需要构造其他信息,例如“LogEventBridge”对象和“SslConfiguration”对象。我不知道如何将这些对象提供给命令行,所以我决定编写一个Java程序来初始化和运行服务器。这是我的密码: public c

我正在尝试设置一个log4j2securetcpsocketserver,它将从远程应用程序接收日志(使用log4j2进行日志记录)。我已经使用TcpSocketServer创建了原型,它可以通过提供端口号和配置文件从命令行运行。但是,SecureTcpSocketServer需要构造其他信息,例如“LogEventBridge”对象和“SslConfiguration”对象。我不知道如何将这些对象提供给命令行,所以我决定编写一个Java程序来初始化和运行服务器。这是我的密码:

public class log4j2SocketServer {

    public static void main(String[] args) {

        KeyStoreConfiguration keyStoreConf = null;
        TrustStoreConfiguration trustStoreConf = null;
        SecureTcpSocketServer<ObjectInputStream> myServer = null;
        try {
            keyStoreConf = new KeyStoreConfiguration("keystore.jks", "password", null, null);
        } catch (StoreConfigurationException e) {
            e.printStackTrace();
        }
        try {
            trustStoreConf = new TrustStoreConfiguration("keystore.jks", "password", null, null);
        } catch (StoreConfigurationException e) {
            e.printStackTrace();
        }
        SslConfiguration sslConf = SslConfiguration.createSSLConfiguration("SSL", keyStoreConf, trustStoreConf);
        try {
            myServer = new SecureTcpSocketServer<ObjectInputStream>(5514,new ObjectInputStreamLogEventBridge(),sslConf);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while(true){}
    }
}
我主要关心的是我编写服务器代码的方式。当我开始编写代码时,我想我需要做的就是实例化SecureTcpSocketServer。我这样做了,然后(显然)程序运行了,然后…结束了,垃圾收集了我的服务器。因此,我决定在之后加入一个无限循环,以保持服务器的活力。我严重怀疑这是正确的方法,但我对编码还相当陌生,我不确定最好的方法是什么。我的问题是,这个实现可以吗?我的意思是,显然有什么地方出了问题,因为我没有收到日志…这个循环导致了问题吗?还是我没有考虑到其他问题


还有一件事:我希望我的客户端应用程序运行,连接到服务器并发送日志,然后终止。现在,它似乎正在连接,但似乎没有发送日志,然后它就挂起,直到我手动终止它。这让我觉得服务器端无限循环在某种程度上进行干扰

查看
SecureTcpSocketServer
及其超类
TcpSocketServer
的源代码,我认为仅仅构造一个实例不足以启动服务器。您需要调用它的
run()
方法,让它开始接受连接


log4j2SocketServer
类中,将
while(true){}
替换为
myServer.run()。此方法将一直阻止,直到
active
设置为
false
或服务器套接字关闭。

回答非常好,谢谢!事实上,我昨天就成功了(完全按照你的建议去做),但是因为我的新账户stackoverflow阻止了我发布答案。再次感谢雷姆科。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="remoteLogging" packages="">
  <Appenders>
    <Socket name="socket" host="xx.xx.xx.xx" port="5514">
      <SerializedLayout />
      <SSL>
        <KeyStore location="keystore.jks" password="password"/>
        <TrustStore location="keystore.jks" password="password"/>
      </SSL>
    </Socket>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="socket"/>
    </Root>
  </Loggers>
</Configuration>
public class remoteLogging {
    static final Logger log = LogManager.getLogger(remoteLogging.class.getName());
    public static void main(String[] args) {
        log.debug("Hello this is a debug message");
        log.info("Hello this is an info message");
        log.warn("Hello this is a warn message");
        log.error("Hello this is a error message");
    }
}