导读:本期聚焦于樱由罗创作的《CentOS syslog-ng高级日志处理怎么配置?多源采集与日志转发实战详解》,敬请观看详情。日志文件分散在不同服务器上,排查问题时挨个登录查看效率极低。syslog-ng作为CentOS下一款功能强大的日志管理工具,支持从文件、网络、程序输出等多种来源采集日志,经过过滤、解析和重写之后,可以按需写入本地文件或转发到远程日志服务器集中处理。本文围绕syslog-ng的高级用法展开,先讲解安装与核心配置文件结构,再介绍source、destination、filter、log四条语句的关联方式,然后演示基于正则表达式与程序名的日志过滤、模板自定义、磁盘缓冲队列以及TLS加密转发等实用技巧,最后给出一套可直接套用的集中式日志收集方案,帮助你把散落的日志统一管理起来。

系统日志、应用日志、安全审计日志分散在几十台机器上,一旦线上出问题,运维人员只能一台台登录服务器去翻/var/log/messages,这种排查方式既低效又容易遗漏关键线索。syslog-ng在CentOS上提供了比传统rsyslog更灵活的日志处理能力,它把日志的采集、过滤、解析、存储、转发抽象成四类配置语句,组合起来几乎能应对所有日志管理场景。本文从配置结构讲起,逐步展开过滤规则、模板定制、缓冲队列和加密转发这些进阶技巧,并给出一份集中式日志收集的完整配置示例。

CentOS syslog-ng高级日志处理怎么配置?多源采集与日志转发实战详解

一、syslog-ng的安装与配置文件结构

CentOS 7以上的版本可以直接通过EPEL仓库安装syslog-ng,安装前先确认系统已启用EPEL源。需要注意的是,syslog-ng和rsyslog默认都监听514端口,两者不能同时以服务端模式运行,切换前建议先停掉rsyslog服务,否则端口冲突会导致启动失败。

yum install -y epel-release
yum install -y syslog-ng
systemctl stop rsyslog
systemctl disable rsyslog
systemctl enable --now syslog-ng

syslog-ng的主配置文件位于/etc/syslog-ng/syslog-ng.conf,开头一行@include指令会把conf.d目录下所有以.conf结尾的文件全部加载进来。生产环境推荐把自定义配置全部写在conf.d目录中,避免直接改动主文件,这样软件升级时自定义配置也不容易被覆盖。

整个配置体系由四种语句构成:source定义日志从哪里来,可以是本地文件、UDP/TCP网络、Unix套接字,甚至某个程序的输出;destination定义日志到哪里去,可以是本地文件、远程服务器、数据库或消息队列;filter定义匹配条件,支持按设施、优先级、主机名、正则表达式过滤;log语句则是把前三者串起来,声明一条完整的日志管道。理解了这个逻辑,再看任何复杂配置都不会发懵。

二、source与destination的高级配置技巧

先看source的写法。除了最常见的系统日志,syslog-ng还支持tail任意文本文件,这对采集Nginx、Tomcat这类自己写日志文件的应用特别有用。

source s_system {
    system();
};

source s_nginx_access {
    file("/var/log/nginx/access.log" flags(no-parse));
};

source s_network {
    network(transport("tcp") port(514) max-connections(100));
};

上面三个source分别对应系统日志、文件跟踪和网络接收。flags(no-parse)告诉syslog-ng不要把文件内容当作标准syslog报文解析,而是整行当作原始消息处理,这样才能用后续的parser去解析JSON或自定义格式。network driver里还可以指定transport("tls")启用加密接收,后面会单独讲。

destination同样灵活,最常用的是按模板写文件,以及转发到远程中心服务器:

destination d_by_host {
    file("/var/log/remote/$HOST/$YEAR-$MONTH-$DAY.log"
         create-dirs(yes)
         owner("logadmin") group("logadmin") perm(0640));
};

destination d_center {
    network("192.168.10.20" transport("tcp") port(514)
            disk-buffer(
                mem-buf-size(10000)
                disk-buf-size(200000000)
                reliable(yes)
                dir("/var/spool/syslog-ng/")
            ));
};

第一个destination用宏变量按主机名和日期自动分目录存储,create-dirs(yes)保证目录不存在时自动创建,perm(0640)收紧了文件权限。第二个destination的关键在于disk-buffer:当网络中断或中心服务器宕机时,日志会先写入本地磁盘缓冲区,恢复后自动重传,reliable(yes)确保消息不丢失。这个缓冲机制是生产环境转发日志时必配的选项,很多人忽略了它,结果网络一抖动日志就永久丢失。

三、filter过滤与rewrite重写的组合应用

filter是syslog-ng的灵魂,支持多条件组合。比如想把所有包含error或critical关键字的应用日志单独收集,同时排除掉调试类消息,可以这样写:

filter f_errors {
    level(emerg..err) or message("error|critical");
};

filter f_apps {
    program("nginx|java|sshd") and not level(debug);
};

filter f_exclude_noise {
    not message("health check") and not host("monitor-agent");
};

level()支持范围写法,emerg..err表示从最严重到err级别的全部消息。program()按产生日志的进程名匹配,message()内部走的是正则匹配,注意特殊字符需要转义。多个filter之间可以用and、or、not自由组合,语法非常接近编程语言里的布尔表达式。

rewrite则用于改写日志内容。典型场景是脱敏:把日志里的IP地址替换成掩码,或者统一消息格式。下面这个例子用正则把IPv4地址最后一段替换为星号:

rewrite r_mask_ip {
    subst("([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)[0-9]{1,3}", "\1***",
          value("MESSAGE"), type("pcre"));
};

这里用了PCRE正则,捕获组通过\1引用保留前三段。类似手法还可以用来删除敏感的手机号、身份证号,或者给缺少主机名的消息补全$HOST字段。rewrite放在log语句链里执行,改写完成后再走destination,落盘的就是脱敏后的内容。

log语句负责把这一切串起来,一条完整链路的写法如下:

log {
    source(s_system);
    filter(f_errors);
    rewrite(r_mask_ip);
    destination(d_center);
    flags(final);
};

flags(final)表示匹配到这条链路的消息不会再进入后续链路,避免同一份日志被重复处理。多条log链路按配置文件中的顺序依次匹配,合理利用final标记可以让配置逻辑更清晰。

四、搭建一套集中式日志收集方案的完整示例

最后把前面的知识点串成一个可落地的方案:Web服务器作为客户端采集nginx日志并转发,日志中心负责接收、按主机分目录存储,并在传输层启用TLS加密。日志中心端的配置如下:

source s_tls {
    network(transport("tls") port(6514)
        tls(key-file("/etc/syslog-ng/tls/server.key")
            cert-file("/etc/syslog-ng/tls/server.crt")
            peer-verify(optional-untrusted)));
};

destination d_hosts {
    file("/data/logs/$HOST/$PROGRAM/$YEAR-$MONTH-$DAY.log"
         create-dirs(yes));
};

log { source(s_tls); destination(d_hosts); };

客户端转发端的配置把transport换成tls,并指定CA证书验证服务端身份:

destination d_center_tls {
    network("log-center.internal" transport("tls") port(6514)
        tls(ca-file("/etc/syslog-ng/tls/ca.crt")
            key-file("/etc/syslog-ng/tls/client.key")
            cert-file("/etc/syslog-ng/tls/client.crt"))
        disk-buffer(reliable(yes) disk-buf-size(512000000)
                    dir("/var/spool/syslog-ng/")));
};

证书可以用openssl自签,把CA证书分发到所有客户端即可完成双向认证。配置完成后用syslog-ng -s做语法检查,再用syslog-ng-ctl reload平滑重载配置,不会中断正在处理的日志流。日常排查时查看stats计数非常直观:syslog-ng-ctl stats能实时看到每条链路处理了多少条消息,判断过滤规则是否生效一目了然。

整体来看,syslog-ng的配置思路就是搭积木:source收进来,filter筛一遍,rewrite改一改,destination送出去。掌握了这四类语句的组合方式,无论是简单的日志归档还是多级日志中心级联,都能用同一套方法解决。如果环境规模继续扩大,还可以在destination端接入Kafka或Elasticsearch,把syslog-ng当作统一的日志采集入口来使用。

syslog-ng配置CentOS日志管理日志转发修改时间:2026-09-04 02:05:12

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260904/49944.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。