rsyslog配置

  1. 学习
  2. 小实验
  3. 参考

学习

  • rsyslog作用

其实作用就是收集、转发、保存系统日志,比如/var/log/messages

  • 查看版本

rsyslogd -v

  • 配置

rsyslog的配置文件一般在/etc/rsyslog.conf下

首先按官方文档所言,rsyslog支持三种不同的配置格式:basic(以前叫sysklogd,比较基本的格式);advanced;obsolete legacy(基本不用)

    • basic格式
#一般由两个字段组成,selector和action
#selector由两部分组成:facility和priority,facility就是生成消息的子系统,比如第一行的mail,优先级就是log级别,比如第一行的info
#action就是日志转储的位置,比如/var/log/maillog绝对路径(尽量避免相对路径),此外,还可以往管道、console、远程和用户输出
#把mail的info或更低级别日志写入/var/log/maillog,-的意思是异步写入,也就是先缓存到内存中,合适的时机再写入
mail.info   -/var/log/maillog
#把所有信息低于等于info的都写入,除了mail、authpriv和cron
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
#把kern.crit转发到远程主机
kern.crit     @finlandia
#转发到console
kern.crit     /dev/console
#把err以上,info及以下的内容转发到/var/adm/kernel-info
kern.info;kern.!err   /var/adm/kernel-info
    • 规则集

包含一个filter和一组action。下面input是把从端口10514接收的消息绑定到规则集rulesetname。这样从这个端口过来的消息就通过这个规则集来处理了。

看上去这个规则集在区分本地log和远程转发的log的话很好用,比如每个不同的端口过来的log都分别定义一个规则集

ruleset(name="rulesetname") {
    action(type="omfile" file="/path/to/file")
    action(type="..." ...)
    /* and so on... */
}

input(type="imptcp" port="10514" ruleset="rulesetname")
    • 模板

允许指定用户可能需要的任何格式,还用于动态文件名生成

    • 常用内容
类型 名称 作用 示例
变量 %HOSTNAME% 日志来源的主机名 /var/log/%HOSTNAME%/app.log
变量 $fromhost-ip 日志来源的 IP 地址 if ($fromhost-ip == "192.168.1.100")
变量 $programname 生成日志的程序名称 if ($programname == "sshd")
变量 $syslogseverity 日志的优先级 if ($syslogseverity <= 4)
变量 $msg 日志消息的内容 if ($msg contains "error")
模块 omfile 将日志写入本地文件 action(type="omfile" file="/path/to/file")
模块 omfwd 将日志转发到远程服务器 action(type="omfwd" target="192.168.1.100")
模块 ommysql 将日志写入 MySQL 数据库 action(type="ommysql" server="localhost")
模块 omelasticsearch 将日志写入 Elasticsearch action(type="omelasticsearch" server="localhost")
模块 omstdout 将日志输出到标准输出 action(type="omstdout")

小实验

  • omfile和omfwd能不能同时进行?

假设以下情况,我已经在一个机器a上配置了log转发,转发到机器b上,那么机器b上能不能同时设置omfile和omfwd?也就是把收到的转发的log一边保存在本地,一边继续转发出去?

这里我用两台机器实现这样的情景:在机器A上配置netconsole,让它把kernel日志转发到机器B上,然后机器B上配置/etc/rsyslog.conf,让它往本地存储一份的同时,往机器A的514端口发log

验证过程为:在机器A上执行for i in seq 1000;do echo 111 > /dev/kmsg;done,然后在机器A上tcpdump -i eth1 port 514抓包。正常情况下的传导链条应该是,A:netconsole->B:rsyslog->A:本地 B:rsyslog

结果:

在机器A的tcpdump上抓到了转发过来的包

这是一张图片

在机器B本地配置的文件上也看到了转发的log

这是一张图片

这就可以说明,保存本地的action和远程转发的规则是可以同时生效的

  • 转发回环的话会发生什么?

再进一步,如果我继续在机器A上配置往机器B的log转发,形成一个回环会怎么样呢?如下:A:netconsole->B:rsyslog->A:rsyslog,最后会不会形成一条消息从A的rsyslog到B的rsyslog一直循环转发?

试一下

我A机器上配置如下

这是一张图片

机器B上配置类似

这时候理论上来说当在A机器上echo test > /dev/kmsg时,因为配置了netconsole,转发到了机器B的rsyslog中;机器B的rsyslog接收到之后因为rsyslog.conf中配置向机器A的rsyslog转发,所以它把接收到的log转发到机器A;机器A的rsyslog接收到之后因为rsyslog.conf中配置向机器B的rsyslog转发,所以它把接收到的log转发到机器B;机器B的rsyslog接收到之后因为rsyslog.conf中配置向机器A的rsyslog转发,所以它把接收到的log转发到机器A;机器A的rsyslog接收到之后因为rsyslog.conf中配置向机器B的rsyslog转发,所以它把接收到的log转发到机器B;机器B的rsyslog接收到之后因为rsyslog.conf中配置向机器A的rsyslog转发,所以它把接收到的log转发到机器A;机器A的rsyslog接收到之后因为rsyslog.conf中配置向机器B的rsyslog转发,所以它把接收到的log转发到机器B;机器B的rsyslog接收到之后因为rsyslog.conf中配置向机器A的rsyslog转发,所以它把接收到的log转发到机器A;机器A的rsyslog接收到之后因为rsyslog.conf中配置向机器B的rsyslog转发,所以它把接收到的log转发到机器B;…………….一直无限循环

可以看到,两个机器上的tcpdump框框抓包,一直循环

这是一张图片

由此得出结论:两个机器上的rsyslog都配置往对方机器转发日志的话,会造成无限循环刷log!!!哈哈哈

ps:这破坏境真麻烦,搞了好久

pps:知道结论了就好了,尽量别这么完,一小会本地log存了200多M,这要网速再快点等一会磁盘都得打爆了

参考

https://www.rsyslog.com/doc/configuration/index.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 857879363@qq.com