我正在尝试设置一个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。我做了这个,然后(显然)程序运行,然后......结束,垃圾收集我的服务器。所以我决定在之后放置一个无限循环,以保持服务器活着。我非常怀疑这是正确的方法,但我对编码很新,我不确定最好的方法是什么。我的问题是,这个实施是否可以?我的意思是显然出现了问题,因为我没有收到日志......这个循环是否会导致问题?或者还有其他错误,我没有考虑过吗?
还有一件事:我希望我的客户端应用程序能够运行,连接到服务器并发送其日志,然后终止。现在,它似乎连接,但似乎没有发送日志,然后它只是挂起,直到我手动终止它。这让我觉得服务器端的无限循环会以某种方式干扰?
答案 0 :(得分:1)
查看SecureTcpSocketServer
及其超类TcpSocketServer
的来源,我认为构建实例并不足以启动服务器。您需要调用其run()
方法让它开始接受连接。
在log4j2SocketServer
班级中,将while(true){}
替换为myServer.run();
。此方法将阻塞,直到active
设置为false
或者直到serverSocket关闭。