CentOS 7中syslog未写入/var/log/messages问题求助
问题排查与解决:CentOS7下logger命令无法将日志写入/var/log/messages
可能原因与分步排查
1. 先验证基础logger命令是否生效
跳过脚本,手动执行测试命令确认核心功能:
echo "Test Service Status Log" | /usr/bin/logger -t "ServiceStatus" -p user.error
随后检查日志:
grep "ServiceStatus" /var/log/messages
- 若能找到测试日志:问题出在脚本的服务遍历逻辑,跳转至第3点排查。
- 若找不到:问题在rsyslog配置或系统层面,跳转至第2点排查。
2. 检查rsyslog配置与运行状态
2.1 确认rsyslog服务正常运行
systemctl status rsyslog
确保服务处于active (running)状态,若未启动则执行:
systemctl start rsyslog systemctl enable rsyslog
2.2 检查rsyslog日志路由规则
打开/etc/rsyslog.conf,确认是否存在包含user.error的路由配置:
CentOS7默认配置中,以下行会将所有*.info及更高级别日志(包含user.error)写入/var/log/messages:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
若该行被注释或修改,恢复默认后重启rsyslog:
systemctl restart rsyslog
2.3 排查SELinux拦截问题
CentOS7默认开启SELinux,可能阻止logger写入操作。临时关闭测试:
setenforce 0
重新执行测试命令,若日志正常生成,需调整SELinux策略:
# 允许syslogd接收logger写入的SELinux规则 semanage permissive -a syslogd_t
3. 排查脚本中的服务遍历逻辑
3.1 验证服务列表获取是否正确
在CentOS7上手动执行以下命令,确认输出为有效服务名:
systemctl list-unit-files --type=service --no-legend | awk '{print $1}'
若输出包含空行或异常字符,修改awk命令过滤有效服务:
services=$(systemctl list-unit-files --type=service --no-legend | awk '{if ($1 ~ /\.service$/) print $1}')
3.2 调试脚本循环逻辑
在脚本中添加控制台输出,确认变量取值:
#!/bin/bash # Iterate through all systemctl services and check their status services=$(systemctl list-unit-files --type=service --no-legend | awk '{if ($1 ~ /\.service$/) print $1}') for service in $services do status=$(systemctl is-active $service) # 控制台调试输出 echo "Processing: $service -> $status" # Send logs to rsyslogd echo "$service: $status" | /usr/bin/logger -t "ServiceStatus" -p user.error done
运行脚本后,查看控制台输出是否符合预期,同时再次检查/var/log/messages。
4. 确认Azure Monitor日志采集配置
若本地日志写入恢复正常但Azure Monitor仍无法推送,需确认:
- Azure Monitor Agent已正确安装并运行在CentOS7节点
- 日志采集规则已包含
/var/log/messages或ServiceStatus标签的日志
内容的提问来源于stack exchange,提问作者GoneCase123
相关产品推荐
相关产品推荐

