1. 项目概述
最近在负责将一批Linux服务器接入机房的统一日志平台,主要目标是实现主机日志的集中收集和管理。这种日志上报的核心流程其实很简单:收集日志并上报。但在实际操作中,每个环节都有不少需要注意的技术细节和配置要点。
日志上报主要有两种常见方式:Rsyslog和FTP。本文重点介绍Rsyslog方式的实现,这也是目前最主流、最稳定的日志收集方案。相比FTP方式,Rsyslog具有实时性强、资源占用低、配置简单等优势,特别适合需要实时监控的场景。
提示:在实际操作前,建议先与日志平台管理员确认具体的技术要求和规范,包括日志格式、传输协议、目标地址等关键信息。
2. 实施前的准备工作
2.1 确认日志收集需求
在开始配置前,必须明确三个关键要素:
-
上报地址:日志服务器的IP和端口
- 示例:UDP 10.44.132.93:2514 和 UDP 10.44.132.94:2514
- 注意区分IPv4和IPv6地址格式
-
日志类型:需要收集的具体日志内容
- 登录/登出日志(auth/authpriv)
- 用户操作日志(user.info)
-
传输协议:UDP还是TCP
- UDP性能更好但不可靠
- TCP更可靠但资源消耗更大
2.2 网络连通性测试
在正式配置前,建议先测试网络连通性:
bash复制# IPv4测试
echo "test" > /dev/udp/10.44.132.93/2514
# IPv6测试
echo "test" > /dev/udp/[2409:8034:5aff:3200::5:94]/2514
让日志平台管理员确认是否收到测试数据,这一步可以避免后续很多网络层面的问题。
3. 操作日志收集配置
3.1 配置Bash操作日志
为了记录用户的所有操作命令,我们需要修改/etc/bashrc文件:
bash复制sudo vi /etc/bashrc
在文件末尾添加以下脚本:
bash复制# ===== 操作日志监控脚本开始 =====
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
export HISTSIZE=9999
up_client_ip=`(who -m|cut -d\( -f2|cut -d\) -f1)`
if ( test -z "`echo $up_client_ip|awk '($1 ~/[0-9]+.[0-9]+.[0-9]+.[0-9]+/)'`" )
then
up_client_ip=`awk '/'$up_client_ip'/ {print $1}' /etc/hosts`
fi
export PROMPT_COMMAND='{ logger -p user.info -- time=\"$(history 1 | { read x y z m; echo $y $z;})\" src_ip=\"$up_client_ip\" dst_ip=\"服务器IP\" account=\"$(whoami)\" operation=\"$(history 1 | { read x y z m; echo $m;})\" 2>/dev/null;}'
# ===== 操作日志监控脚本结束 =====
关键参数说明:
HISTTIMEFORMAT:设置历史命令的时间格式HISTSIZE:设置保存的历史命令数量PROMPT_COMMAND:每次命令执行后自动记录的日志格式
注意:务必将脚本中的"服务器IP"替换为当前服务器的实际IP地址。
3.2 应用配置
执行以下命令使配置生效:
bash复制source /etc/bashrc
注意:这个配置只对新的SSH会话有效,已有会话不会继承这些变更。
4. SSH登录日志配置
4.1 确认Syslog Facility
编辑SSH配置文件:
bash复制sudo vi /etc/ssh/sshd_config
查找SyslogFacility参数,确认其值为AUTH或AUTHPRIV:
code复制SyslogFacility AUTHPRIV
这个值决定了SSH日志将通过哪个syslog facility发送,必须与后续rsyslog配置保持一致。
4.2 重启SSH服务
如果修改了配置,需要重启SSH服务:
bash复制sudo systemctl restart sshd
5. 本地日志存储配置
5.1 配置rsyslog本地存储
编辑rsyslog主配置文件:
bash复制sudo vi /etc/rsyslog.conf
确保有以下配置(根据实际的SyslogFacility调整):
code复制authpriv.* /var/log/secure
这表示所有authpriv级别的日志都将记录到/var/log/secure文件中。
5.2 验证本地日志
可以通过以下命令实时查看日志:
bash复制# 查看操作日志
sudo tail -f /var/log/messages
# 查看登录日志
sudo tail -f /var/log/secure
打开新的SSH窗口执行一些命令,应该能看到相应的日志记录。
6. 日志外发配置
6.1 配置rsyslog远程传输
在/etc/rsyslog.conf文件末尾添加:
code复制# ===== 日志外发配置开始 =====
# 操作日志外发
user.info @[2409:8034:5aff:3200::5:93]:2514
# 登录登出日志外发
authpriv.* @[2409:8034:5aff:3200::5:94]:2514
# 本地保存操作日志
user.info /var/log/opersys.log
# ===== 日志外发配置结束 =====
协议说明:
| 写法 | 含义 |
|---|---|
| @IP:端口 | UDP发送 |
| @@IP:端口 | TCP发送 |
| IP:端口 | 本地文件存储 |
6.2 配置验证
在重启rsyslog前,先验证配置是否正确:
bash复制sudo rsyslogd -N1
如果没有报错,就可以重启服务:
bash复制sudo systemctl restart rsyslog
7. 日志传输验证
7.1 手动发送测试日志
bash复制logger -p user.info "rsyslog_test_message"
7.2 本地抓包验证
bash复制sudo tcpdump -i any udp port 2514 -nn -A
应该能看到测试消息的传输。
7.3 平台侧验证
联系日志平台管理员确认是否收到测试日志,这是最终验证步骤。
8. 注意事项与常见问题
8.1 安全性考虑
- 日志伪造风险:UDP协议容易被伪造,重要环境建议使用TCP或TLS加密
- IP记录问题:通过su切换用户可能导致源IP丢失
- 日志绕过:有经验的用户可能通过修改环境变量绕过日志记录
8.2 性能优化建议
- 日志轮转:配置logrotate防止日志文件过大
- 队列设置:高负载环境下适当调整rsyslog内存队列大小
- 批量发送:通过
$ActionQueueType和$ActionQueueSize参数优化传输
8.3 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 日志未发送 | 网络不通 | 检查防火墙和路由 |
| 日志格式错误 | 模板不匹配 | 检查日志平台要求的格式 |
| 日志丢失 | UDP丢包 | 改用TCP或增加重试机制 |
| 服务无法启动 | 配置错误 | 使用rsyslogd -N1验证 |
9. 高级配置建议
对于需要更高安全性和可靠性的环境,可以考虑以下增强方案:
-
TLS加密传输:
bash复制# 在/etc/rsyslog.conf中添加 $DefaultNetstreamDriver gtls $DefaultNetstreamDriverCAFile /path/to/ca.pem $ActionSendStreamDriverMode 1 $ActionSendStreamDriverAuthMode x509/name -
使用RELP协议:
bash复制# 安装RELP支持 sudo yum install rsyslog-relp # 配置示例 authpriv.* :omrelp:10.44.132.94:2514 -
日志过滤与处理:
bash复制# 条件过滤示例 if $msg contains "error" then { action(type="omfile" file="/var/log/errors.log") stop }
10. 替代方案比较
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Rsyslog | 轻量、实时性好 | 安全性较低 | 一般日志收集 |
| Auditd | 审计级别高 | 资源消耗大 | 安全合规场景 |
| Fluentd | 处理能力强 | 配置复杂 | 大规模日志处理 |
| Filebeat | 专为日志设计 | 功能单一 | ELK栈集成 |
在实际项目中,我通常会根据具体需求选择最合适的方案。对于大多数基础日志收集需求,Rsyslog已经足够,而且它的资源占用最小,对系统性能影响几乎可以忽略不计。