Logback通过SSL向syslog-ng发送日志遇序列化乱码问题求解
解决Logback通过SSL向syslog-ng发送日志的乱码问题
你遇到的乱码问题根源很明确:SSLSocketAppender是Logback专为自身SocketServer设计的组件,它发送的是Java序列化的LoggingEvent对象,而非标准syslog格式的文本,所以syslog-ng收到的是二进制序列化数据,自然显示为乱码。
不用折腾反序列化的方案,直接发送加密的标准syslog文本是最简便的解决思路,下面提供两种可行方案:
方案1:用Logback原生SocketAppender实现SSL+标准syslog发送
从Logback 1.2.0版本开始,SocketAppender支持配置encoder输出文本内容,配合SSL SocketFactory就能实现加密传输标准syslog消息:
Logback配置(logback.xml)
<appender name="SYSLOG_SSL" class="ch.qos.logback.classic.net.SocketAppender"> <!-- 替换为你的syslog-ng服务器地址 --> <remoteHost>syslog-ng-server-ip</remoteHost> <!-- syslog-ng默认TLS接收端口是6514 --> <port>6514</port> <!-- 启用SSL Socket工厂 --> <socketFactory class="javax.net.ssl.SSLSocketFactory" /> <!-- 配置输出为RFC3164标准syslog格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- %syslogStart{LOCAL0} 生成syslog优先级头,LOCAL0为日志设施,可按需修改 --> <pattern>%syslogStart{LOCAL0} %date{MMM dd HH:mm:ss} %hostname %msg%n</pattern> </encoder> <!-- 可选:连接超时和重连配置 --> <connectionTimeout>3000</connectionTimeout> <reconnectionDelay>5000</reconnectionDelay> </appender> <root level="INFO"> <appender-ref ref="SYSLOG_SSL" /> </root>
syslog-ng接收配置
在syslog-ng中配置TLS接收源,示例:
source s_tls_syslog { tcp( port(6514) tls( key-file("/etc/syslog-ng/ssl/server.key") # 服务器私钥路径 cert-file("/etc/syslog-ng/ssl/server.crt") # 服务器证书路径 ca-file("/etc/syslog-ng/ssl/ca.crt") # CA证书路径(自签证书需客户端信任) peer-verify(required-trusted) # 可选:验证客户端证书,不需要则设为no ) ); }; # 输出到本地日志文件,可按需修改为其他目标(如数据库) destination d_remote_ssl_logs { file("/var/log/remote/ssl_logs.log"); }; log { source(s_tls_syslog); destination(d_remote_ssl_logs); };
SSL证书准备
需要让Java应用信任syslog-ng的证书:
- 将syslog-ng的CA证书导入Java信任库,或者启动应用时指定信任库参数:
java -Djavax.net.ssl.trustStore=/path/to/your/truststore.jks -Djavax.net.ssl.trustStorePassword=truststore-pass -jar your-app.jar
方案2:使用第三方Syslog TLS Appender
如果不想手动配置SocketFactory,可以用logback-ext-syslog第三方库,它提供了开箱即用的SSL支持SyslogAppender:
添加Maven依赖
<dependency> <groupId>ch.qos.logback.ext</groupId> <artifactId>logback-ext-syslog</artifactId> <version>0.1.5</version> </dependency>
Logback配置
<appender name="SYSLOG_TLS" class="ch.qos.logback.ext.syslog.SyslogTlsAppender"> <syslogHost>syslog-ng-server-ip</syslogHost> <port>6514</port> <facility>LOCAL0</facility> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%msg%n</pattern> </encoder> <ssl>true</ssl> <trustStore>/path/to/truststore.jks</trustStore> <trustStorePassword>truststore-pass</trustStorePassword> </appender> <root level="INFO"> <appender-ref ref="SYSLOG_TLS" /> </root>
syslog-ng的接收配置和方案1完全一致,这样就能直接发送加密的标准syslog消息,无需处理序列化相关的问题。
内容的提问来源于stack exchange,提问作者patryks
相关产品推荐
相关产品推荐

