Syslog 日志收集和集中管理

FreeGuideOnline 13阅读 2026-07-09

bash sudo apt update && sudo apt install rsyslog -y # Debian/Ubuntu sudo yum install rsyslog -y # RHEL/CentOS


2. **启用 UDP / TCP 接收模块**

编辑主配置文件 `/etc/rsyslog.conf`(或创建 `/etc/rsyslog.d/00-receive.conf`),取消以下注释或添加行:

```conf
# 提供 UDP 接收,端口 514
module(load="imudp")
input(type="imudp" port="514")

# 提供 TCP 接收,端口 514
module(load="imtcp")
input(type="imtcp" port="514")

生产环境建议优先使用 TCP,保证可靠性。如需同时使用,可保留两行。

  1. 定义远程日志存储模板

    我们希望网络设备发来的日志按 IP 和时间自动分类存放。在配置文件中添加模板:

    $template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log"
    *.* ?RemoteLogs
    & stop
    

    解释:

    • %FROMHOST-IP% 取源设备 IP,自动按 IP 创建目录。
    • %$YEAR%... 按日期切分文件。
    • *.* ?RemoteLogs 将所有设施和级别的日志写入该模板。
    • & stop 阻止它们再次写入本地文件,避免重复。
  2. 创建存储目录并设置权限

    sudo mkdir -p /var/log/remote
    sudo chown -R syslog:adm /var/log/remote
    sudo chmod 755 /var/log/remote
    
  3. 重启服务

    sudo systemctl restart rsyslog
    sudo systemctl status rsyslog
    

步骤二:配置客户端发送日志

在你想收集日志的任何 Linux 服务器上,修改 rsyslog 配置。

  1. 编辑客户端配置文件(如 /etc/rsyslog.d/50-forward.conf),添加:

    *.* @192.168.1.100:514          # 使用 UDP 发送
    # *.* @@192.168.1.100:514       # 使用 TCP 发送(两个 @)
    
    • 单个 @ 表示 UDP,两个 @@ 表示 TCP。
    • *.* 表示将所有设施和级别的日志发送到服务器。可根据需要过滤,例如 *.err 只发送 error 及以上级别。
  2. 重启客户端 rsyslog

    sudo systemctl restart rsyslog
    
  3. 验证

    在客户端生成一条测试日志:

    logger "Test syslog message from client"
    

    在日志服务器上查看:

    sudo tail -f /var/log/remote/192.168.1.XX/2025-03-21.log
    

    如果出现测试消息,说明集中收集已生效。


配置网络设备发送 Syslog

以 Cisco 路由器和交换机为例,登录后执行:

login: admin
password: ************
Router> enable
Router# configure terminal
Router(config)# logging 192.168.1.100 transport udp port 514
Router(config)# logging facility local6
Router(config)# logging source-interface GigabitEthernet0/0
Router(config)# end
Router# write memory

大部分防火墙、交换机、AP 均有类似界面。关键参数:

  • 目标 IP 指向你的日志服务器。
  • 选择合适的 Facility(如 local6),方便在服务器端分类。
  • 确保网络可达,防火墙放行 UDP/TCP 514 端口。

日志轮转与存储管理

无限制的日志会撑爆磁盘。使用 logrotate 自动切割和压缩。

  1. 为远程日志创建专用轮转配置 /etc/logrotate.d/rsyslog-remote

    /var/log/remote/*/*.log {
        daily
        rotate 30
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
            /usr/lib/rsyslog/rsyslog-rotate
        endscript
    }
    
  2. 测试轮转(无需真正执行):

    sudo logrotate -d /etc/logrotate.d/rsyslog-remote
    
  3. 手动强制执行一次:

    sudo logrotate -f /etc/logrotate.d/rsyslog-remote
    

安全传输:使用 TLS 加密 Syslog

默认 Syslog 协议明文传输,在不可信网络中可能被窃听。可通过 rsyslog 的 TLS 加密通道保护日志。

配置服务器端(TLS)

  1. 准备证书文件(自签名或 CA 签发),需包含 ca-cert.pemserver-cert.pemserver-key.pem

  2. /etc/rsyslog.d/00-tls.conf 中添加:

    module(load="imtcp"
           StreamDriver.Name="gtls"
           StreamDriver.Mode="1"
           StreamDriver.AuthMode="x509/name"
           PermittedPeer="*.example.com")
    
    input(type="imtcp" port="6514")
    

    StreamDriver.AuthMode 设置证书验证方式,可根据需求调整。

配置客户端(TLS)

客户端需配置证书和指向服务器的加密端口:

$DefaultNetstreamDriver gtls
$DefaultNetstreamDriverCAFile /etc/ssl/certs/ca-cert.pem
$DefaultNetstreamDriverCertFile /etc/ssl/certs/client-cert.pem
$DefaultNetstreamDriverKeyFile /etc/ssl/private/client-key.pem
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer log-server.example.com
*.* @@(o)192.168.1.100:6514

TLS 配置较为复杂,初学者可先使用内网可信环境下的纯 TCP,后续再加固。


进阶集成:将日志发送到 ELK 或 Graylog

集中 Syslog 只是第一步,更强大的分析和可视化往往需要搭配 ELK (Elasticsearch, Logstash, Kibana) 或 Graylog。

  • rsyslog + Logstash:rsyslog 通过 TCP/JSON 输出到 Logstash,后者过滤后再写入 Elasticsearch。
  • rsyslog 直接输出到 Elasticsearch:可使用 omelasticsearch 模块,但对于复杂解析不如 Logstash 灵活。
  • Syslog Sidecar 方案:使用 Filebeat 读取 rsyslog 自身的文本日志,再发送到 Elasticsearch,架构解耦。

配置示例:rsyslog 输出 JSON 到本地端口,Logstash 监听该端口:

# rsyslog 端
$ModLoad omjson
*.* action(type="omjson" action.resumeRetryCount="-1"
           queue.filename="rsyslog-json" queue.type="LinkedList"
           target="127.0.0.1" port="5514" protocol="tcp")