学习
- 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