Syslog-NG配置:如何按程序名实现条件路由拆分日志文件
Syslog-NG 按程序名路由日志配置方案
你当前使用的3.30版本原生支持该需求,无需额外安装组件,以下是可直接落地的配置,优先实现你提到的「指定程序拆分、其余走默认文件」的效果,同时附无预定义自动拆分的配置方法。
核心实现逻辑
- 利用Syslog-NG内置的
${PROGRAM}宏提取日志对应的来源程序名 - 日志路径按顺序匹配:优先匹配需要单独拆分的程序规则,命中后写入对应同名文件,终止后续匹配
- 未命中拆分规则的日志,统一写入默认的全量日志文件
修改后完整可用配置
@version: 3.30 @include "scl.conf" options { flush_lines (100); # 原配置0为每条日志刷盘,高流量下建议调整为100减少IO压力,无性能要求可保留原值 time_reopen (10); log_fifo_size (1000); chain_hostnames (off); use_dns (yes); use_fqdn (yes); create_dirs (yes); keep_hostname (yes); normalize_hostnames (yes); stats_freq (600); stats_level (2); }; source s_local { internal(); }; source s_network { syslog(transport(udp) port(5514)); }; # 默认全量日志目的地 destination d_logs { file ( "/var/log/all_logs.log" create_dirs(yes) ); }; # 按程序名单独存储的目的地,文件名直接引用程序名宏 destination d_per_program { file( "/var/log/${PROGRAM}.log" create_dirs(yes) ); }; # 定义需要单独拆分的程序列表,按需增删正则内的程序名即可,用|分隔 filter f_split_programs { program("^(dpinger|sshd|unbound)$"); }; # 可选:清洗程序名中的特殊字符,避免路径穿越风险 rewrite r_sanitize_program { subst("/", "_", value("PROGRAM"), flags(global)); subst("\\.\\.", "_", value("PROGRAM"), flags(global)); }; # 拆分规则日志路径:必须放在默认路径之前,命中后直接终止匹配 log { source(s_network); # source(s_local); # 如需本地internal日志也按规则拆分,取消该行注释 rewrite(r_sanitize_program); filter(f_split_programs); destination(d_per_program); flags(final); # 命中该规则的日志不再进入后续log路径 }; # 默认全量日志路径:接收所有未命中拆分规则的日志 log { source(s_network); # source(s_local); rewrite(r_sanitize_program); destination(d_logs); };
配置调整说明
- 新增拆分程序:直接修改
f_split_programs过滤器中正则的程序名列表即可,例如要新增nginx拆分,改为program("^(dpinger|sshd|unbound|nginx)$") - 忽略程序名大小写:如果日志中程序名存在大小写不统一的情况,给program匹配加
flags(ignore-case)参数,写法为program("^(dpinger|sshd|unbound)$", flags(ignore-case)); - 无预定义自动拆分:如果要实现所有程序日志自动写入同名文件、无需提前配置列表,直接删除拆分log路径中的
filter(f_split_programs);行即可。注意该模式会在日志目录生成大量零散文件,生产环境不推荐使用。如果需要同时保留全量日志,删除该行的同时去掉flags(final);参数即可,日志会同时写入单独程序文件和全量文件。 - 权限注意:确保Syslog-NG运行用户对
/var/log目录有写入权限,否则会出现文件创建失败、日志丢失的问题。
内容的提问来源于stack exchange,提问作者stumped221
相关产品推荐
相关产品推荐

