如何用 Log4j 把日志写入 syslog?

Log4j2 通过 SyslogAppender 把日志发到本地或远程 syslog:在 log4j2.xml 中配置 Syslog appender 指定 host、port、protocol 与格式。本文给出完整配置与注意事项。

最佳实践
如何用 Log4j 把日志写入 syslog?封面

核心做法:Log4j2 内置 Syslog Appender,在 log4j2.xml 中声明一个指向 syslog 网络服务(本地回环或远程 host:port,不直接写 Unix socket /dev/log)的 appender,挂到 Logger 上即可;协议选 TCP 更可靠,格式建议 RFC5424。

1. 添加依赖

Maven:先在项目 properties 或依赖管理中定义兼容且受维护的 log4j2.version,API 与 Core 使用一致版本;此属性不是 Maven 自动提供。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2.version}</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 服务器 IP
  • protocol:TCP(可靠)或 UDP(快但可能丢)
  • facility:LOCAL0~LOCAL7 通常留给应用自定义
  • appName:出现在 syslog 消息里,标识应用来源

3. 注意事项

  1. 远程 syslog 服务要先开端口:先检查是否已有 TCP 监听;现代 rsyslog 可用 module(load="imtcp") 与 input(type="imtcp" port="514"),避免重复加载并验证配置。
  2. 生产用 TCP:UDP 可能丢包;TCP 也不保证后端已持久保存。该 Appender 不支持 RELP,审计场景需结合持久队列、转发代理与接收端存储要求。
  3. 异步提升吞吐:可按 Log4j2 文档配置异步 Logger 或 Appender,将 I/O 移到后台,但仍需核对队列满策略、依赖及退出刷新。
  4. 测试连通:Linux util-linux 的 logger -p local0.info -n 127.0.0.1 -P 514 -T "test" 可先验证通道;其他实现参数不同,还需发真实 Appender 消息核对格式与分隔。

如果接收端使用观测云 DataKit,可按 TCP/UDP 日志接收配置设置监听地址,并让 Appender 使用一致的协议和端口。发送上面的测试消息后,检查原文、时间和级别解析结果,再转发业务日志。

常见问题(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;但同步 I/O、过滤、异常处理和队列策略仍会影响行为,不能认为完全互不影响。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台