You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:00:58