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