如何用 Log4j 把日志写入 syslog?
Log4j2 通过 SyslogAppender 把日志发到本地或远程 syslog:在 log4j2.xml 中配置 Syslog appender 指定 host、port、protocol 与格式。本文给出完整配置与注意事项。
核心做法:Log4j2 内置 Syslog Appender,在 log4j2.xml 中声明一个指向 syslog 服务(本地 /dev/log 或远程 host:port)的 appender,挂到 Logger 上即可;协议选 TCP 更可靠,格式建议 RFC5424。
1. 添加依赖
Maven:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.23.1</version>
</dependency>
2. 配置 Syslog Appender
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Syslog name="Syslog" host="127.0.0.1" port="514"
protocol="TCP" facility="LOCAL0"
format="RFC5424" appName="order-service"
newLine="true" charset="UTF-8"/>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss} %-5p %c - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="Syslog"/>
</Root>
</Loggers>
</Configuration>
关键属性:
host/port:syslog 服务地址,远程集中时填 syslog 服务器 IPprotocol:TCP(可靠)或UDP(快但可能丢)facility:LOCAL0~LOCAL7通常留给应用自定义appName:出现在 syslog 消息里,标识应用来源
3. 注意事项
- 远程 syslog 服务要先开端口:rsyslog 默认不监听 514,需取消
$ModLoad imtcp/$InputTCPServerRun 514注释。 - 生产用 TCP:UDP 丢包无感知,审计类日志必须 TCP 或 RELP。
- 异步提升吞吐:高并发下用
AsyncLogger(Log4j2 的招牌能力)包一层,避免日志 I/O 拖慢业务线程。 - 测试连通:
logger -p local0.info -n 127.0.0.1 -P 514 -T "test"先验证通道。
观测云对照
syslog 通道直接对接观测云。 DataKit 支持接收 syslog 消息(TCP/UDP),Log4j2 的 Syslog Appender 指向 DataKit 监听地址即可,日志经 Pipeline 解析后进入日志查看器,无需经过本地 rsyslog 中转。
常见问题(FAQ)
Q:Log4j 1.x 也支持 syslog 吗?
A:有 SyslogAppender,但 Log4j 1.x 早已停止维护且存在安全漏洞,应尽快升级到 Log4j2。
Q:发到 syslog 的日志中文乱码?
A:确认 appender 的 charset="UTF-8",且接收端(rsyslog/DataKit)按 UTF-8 处理。
Q:能同时写文件和 syslog 吗?
A:可以,Logger 挂多个 AppenderRef 即可,互不影响。