日志管理是每个运维工程师的必修课。记得刚入行时,我负责维护二十多台服务器,每天最头疼的就是排查问题时要挨个SSH登录查看日志。后来公司上了统一日志平台,我才真正体会到什么叫"解放生产力"——所有日志集中存储、实时检索、可视化分析,故障定位效率提升了至少三倍。
Rsyslog作为Linux系统自带的日志服务,具有以下不可替代的优势:
先确认基础环境是否符合要求:
bash复制# 查看系统版本和rsyslog版本
lsb_release -a
rsyslogd -v
# 检查防火墙状态
sudo systemctl status firewalld
sudo ufw status # Ubuntu系
注意:生产环境建议使用Rsyslog v8+版本,老版本可能缺少关键功能模块。CentOS 7默认的v5版需要通过EPEL升级。
日志服务器与客户端之间需要开通相应端口:
bash复制# 测试514端口连通性(默认UDP端口)
nc -zv 日志服务器IP 514
# 推荐使用TCP 6514端口(TLS加密)
nc -zv 日志服务器IP 6514
如果企业有安全合规要求,建议配置TLS加密传输。我们曾经因为使用明文传输日志,在等保测评时被扣分。
bash复制# CentOS/RHEL
sudo yum install rsyslog rsyslog-gnutls
# Ubuntu/Debian
sudo apt install rsyslog rsyslog-gnutls
编辑/etc/rsyslog.conf,核心配置如下:
bash复制# 启用TCP和UDP监听
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
# 定义日志模板 - 按主机名/日期分类存储
template(name="DynFile" type="string"
string="/var/log/remote/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%.log")
# 应用模板规则
if $fromhost-ip != '127.0.0.1' then ?DynFile
& stop
避坑指南:生产环境一定要加上
& stop,否则日志会同时写入本地文件,造成重复存储。
创建/etc/logrotate.d/rsyslog-remote:
bash复制/var/log/remote/*/*.log {
daily
missingok
rotate 30
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
编辑/etc/rsyslog.conf,添加:
bash复制# 转发所有内核日志
kern.* @日志服务器IP:514
# 转发系统日志
*.info;mail.none;authpriv.none;cron.none @日志服务器IP:514
# 转发认证日志
authpriv.* @@日志服务器IP:514 # @@表示TCP协议
只转发错误级别以上的nginx访问日志:
bash复制module(load="imfile" PollingInterval="10")
input(type="imfile"
File="/var/log/nginx/access.log"
Tag="nginx-access"
Severity="error"
Facility="local7")
if $syslogtag == 'nginx-access' then @日志服务器IP:514
使用OpenSSL生成证书(服务端和客户端使用相同CA签发):
bash复制# CA证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
# 服务端证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
bash复制# /etc/rsyslog.conf
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/ca.crt"
DefaultNetstreamDriverCertFile="/etc/rsyslog.d/server.crt"
DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/server.key"
)
module(load="imtcp" StreamDriver.AuthMode="x509/name" StreamDriver.Mode="1")
input(type="imtcp" port="6514")
bash复制# /etc/rsyslog.conf
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/ca.crt"
)
action(
type="omfwd"
Target="日志服务器IP"
Port="6514"
Protocol="tcp"
StreamDriver="gtls"
StreamDriverMode="1"
StreamDriverAuthMode="x509/name"
RebindInterval="50"
)
bash复制# /etc/rsyslog.conf
main_queue(
queue.size="100000" # 队列容量
queue.dequeuebatchsize="1000" # 每次处理条数
queue.workerthreads="4" # 工作线程数
queue.timeoutenqueue="5000" # 超时时间(ms)
)
防止网络中断导致日志丢失:
bash复制action(
type="omfwd"
Target="日志服务器IP"
Port="514"
Protocol="tcp"
queue.filename="fwdq"
queue.maxdiskspace="1g"
queue.saveonshutdown="on"
queue.type="LinkedList"
action.resumeRetryCount="-1"
)
bash复制# 查看队列状态
rsyslogd -N1 | grep -i queue
# 统计日志处理速率
watch -n 1 'grep "imudp.*bytes" /var/log/syslog | tail -n 10'
问题1:日志传输延迟
netstat -antp | grep rsyslog确认连接状态queue.workerthreads参数增加处理线程问题2:证书验证失败
bash复制# 开启debug日志
export RSYSLOG_DEBUG="DebugOnDemand NoStdOut"
rsyslogd -dn > debug.log 2>&1
问题3:磁盘空间不足
queue.maxdiskspace限制磁盘缓冲大小在转发前过滤敏感信息:
bash复制module(load="mmnormalize")
# 定义信用卡号正则
rule=:%cardnum:word:[[0-9]{16}]%
# 替换为****
action(type="mmreplace" replace="****" regex="[[0-9]{16}]")
bash复制action(
type="omfwd"
Target=["10.0.1.1","10.0.1.2"]
Port="514"
Protocol="tcp"
queue.type="linkedList"
action.resumeInterval="30"
loadBalance="on"
)
在Rsyslog服务端配置输出到Kafka:
bash复制module(load="omkafka")
template(name="jsonTemplate" type="list") {
constant(value="{")
property(name="timereported" format="jsonf" outname="@timestamp")
constant(value=",")
property(name="hostname" format="jsonf" outname="host")
constant(value=",")
property(name="syslogtag" format="jsonf" outname="tag")
constant(value=",")
property(name="msg" format="jsonf" outname="message")
constant(value="}")
}
action(
type="omkafka"
topic="syslog"
broker="kafka1:9092,kafka2:9092"
template="jsonTemplate"
partitions.auto="on"
)
经过三年多的实践验证,这套方案在日均TB级日志量的金融场景下依然稳定运行。关键是要根据业务特点做好容量规划,建议: