Syslog 日志收集和集中管理
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,保证可靠性。如需同时使用,可保留两行。
-
定义远程日志存储模板
我们希望网络设备发来的日志按 IP 和时间自动分类存放。在配置文件中添加模板:
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log" *.* ?RemoteLogs & stop解释:
%FROMHOST-IP%取源设备 IP,自动按 IP 创建目录。%$YEAR%...按日期切分文件。*.* ?RemoteLogs将所有设施和级别的日志写入该模板。& stop阻止它们再次写入本地文件,避免重复。
-
创建存储目录并设置权限
sudo mkdir -p /var/log/remote sudo chown -R syslog:adm /var/log/remote sudo chmod 755 /var/log/remote -
重启服务
sudo systemctl restart rsyslog sudo systemctl status rsyslog
步骤二:配置客户端发送日志
在你想收集日志的任何 Linux 服务器上,修改 rsyslog 配置。
-
编辑客户端配置文件(如
/etc/rsyslog.d/50-forward.conf),添加:*.* @192.168.1.100:514 # 使用 UDP 发送 # *.* @@192.168.1.100:514 # 使用 TCP 发送(两个 @)- 单个
@表示 UDP,两个@@表示 TCP。 *.*表示将所有设施和级别的日志发送到服务器。可根据需要过滤,例如*.err只发送 error 及以上级别。
- 单个
-
重启客户端 rsyslog
sudo systemctl restart rsyslog -
验证
在客户端生成一条测试日志:
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 自动切割和压缩。
-
为远程日志创建专用轮转配置
/etc/logrotate.d/rsyslog-remote:/var/log/remote/*/*.log { daily rotate 30 missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript } -
测试轮转(无需真正执行):
sudo logrotate -d /etc/logrotate.d/rsyslog-remote -
手动强制执行一次:
sudo logrotate -f /etc/logrotate.d/rsyslog-remote
安全传输:使用 TLS 加密 Syslog
默认 Syslog 协议明文传输,在不可信网络中可能被窃听。可通过 rsyslog 的 TLS 加密通道保护日志。
配置服务器端(TLS)
-
准备证书文件(自签名或 CA 签发),需包含
ca-cert.pem、server-cert.pem、server-key.pem。 -
在
/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")