Log4j2 SecureTcpSocketServer安装程序

时间:2014-08-07 15:54:04

标签: java log4j2

我正在尝试设置一个log4j2 SecureTcpSocketServer,它将从远程应用程序接收日志(使用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){}
    }
}

使用此代码,服务器似乎启动并侦听端口5514(我使用netstat进行验证)。在客户端,我的log4j2应用程序似乎连接,但我没有看到任何日志通过。这是我的客户代码:

Xml配置文件:

<?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>

这是我的Java代码:

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");
    }
}

我主要关心的是我编写服务器代码的方式。当我开始编写代码时,我认为我需要做的就是实例化一个SecureTcpSocketServer。我做了这个,然后(显然)程序运行,然后......结束,垃圾收集我的服务器。所以我决定在之后放置一个无限循环,以保持服务器活着。我非常怀疑这是正确的方法,但我对编码很新,我不确定最好的方法是什么。我的问题是,这个实施是否可以?我的意思是显然出现了问题,因为我没有收到日志......这个循环是否会导致问题?或者还有其他错误,我没有考虑过吗?

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

1 个答案:

答案 0 :(得分:1)

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

log4j2SocketServer班级中,将while(true){}替换为myServer.run();。此方法将阻塞,直到active设置为false或者直到serverSocket关闭。