如何为Ubuntu服务器的每一条syslog日志行自动添加自定义前缀
实现方案
Ubuntu默认使用rsyslog作为系统日志服务,你可以通过rsyslog的自定义变量、模板功能实现日志前缀自动添加,具体操作按两种场景分别说明:
场景1:前缀从环境变量获取
步骤1:将环境变量传递给rsyslog进程
rsyslog作为systemd管理的系统服务,默认不会继承全局环境变量,需要手动配置传递:
- 创建rsyslog服务的自定义配置目录:
mkdir -p /etc/systemd/system/rsyslog.service.d/ - 编辑配置文件
/etc/systemd/system/rsyslog.service.d/override.conf,添加以下内容:
[Service] # 直接写死环境变量值 Environment="PLUGIN_VERSION=32k0dkwfrghhaq3faiwejaf932" # 如果环境变量存在于文件中,可改用下面的配置直接读取文件 # EnvironmentFile=/etc/your-custom-env-file
- 重载systemd配置生效:
systemctl daemon-reload
步骤2:配置rsyslog日志模板
新建rsyslog规则文件/etc/rsyslog.d/00-custom-prefix.conf,添加以下配置:
# 从环境变量读取前缀值,存入自定义变量 set $!custom_prefix = getenv("PLUGIN_VERSION"); # 定义带前缀的日志模板,可根据需求调整日志其他字段的顺序和格式 $template CustomPrefixedLog,"%$!custom_prefix% %timegenerated% %hostname% %syslogtag% %msg%\n" # 将模板设为所有文件日志的默认模板,所有日志都会自动加上前缀 $ActionFileDefaultTemplate CustomPrefixedLog
步骤3:生效配置
- 先检查配置语法是否正确,避免服务启动失败:
rsyslogd -N1 - 重启rsyslog服务生效:
systemctl restart rsyslog
场景2:前缀从特定文件夹名称获取
如果前缀是某个目录下的文件夹名,只需要调整上述步骤2中自定义变量的取值方式即可,不需要修改环境变量配置:
# 示例:取/opt/app/目录下的第一个子文件夹名作为前缀,可自行替换为你需要的shell命令 set $!custom_prefix = exec("/bin/sh", "-c", "ls -1 /opt/app/ | head -n1"); # 后续模板配置和场景1完全一致 $template CustomPrefixedLog,"%$!custom_prefix% %timegenerated% %hostname% %syslogtag% %msg%\n" $ActionFileDefaultTemplate CustomPrefixedLog
注意:需要确保rsyslog运行用户对你指定的目录有读取权限,否则无法正常获取文件夹名。如果不需要实时更新前缀,也可以提前把文件夹名写入固定文件,用
set $!custom_prefix = exec("cat", "/path/to/prefix-file");读取,性能和稳定性更好。
验证方法
执行命令发送测试日志:logger "test custom prefix log"
查看/var/log/syslog文件,确认最新的日志行最前端已经显示你指定的前缀值。
注意事项
- 如果只需要给nginx的日志加前缀,不需要全量系统日志加前缀,可以在rsyslog规则中匹配nginx的日志来源单独应用模板,不需要修改全局默认模板。
- 前缀包含特殊字符时建议提前转义,避免日志格式错乱。
- 配置修改前建议备份原有rsyslog配置文件,出错可快速回滚。
内容的提问来源于stack exchange,提问作者W4rQCC1yGh
相关产品推荐
相关产品推荐

