rsyslog 简单配置学习整理


=Start=

缘由:

以前被rsyslog给弄伤过,很长时间里都不想再碰它(能通过自己写HTTP服务实现的日志记录转发功能都自己写了);再加上我现在的工作内容其实也没有需要登录IDC服务器做操作的地方,所以Linux服务器的操作也没有之前那么熟练了,更别提rsyslog的配置了。

但最近有个产品测试的工作,里面的日志数据主要是通过syslog同步的,没办法,再熟悉一遍rsyslog的配置,在此过程中也重新整理学习了一遍(rsyslog虽然已经出现很多年了,但其实也一直都在不断发展,配置语法也都有了较大更新),方便以后有需要的时候参考。

正文:

参考解答:

基本上,我们用rsyslog做日志收集和转发,核心就是通过 /etc/rsyslog.conf (包括/etc/rsyslog.d/目录下的各.conf配置文件) 文件中的指令规定『(1)什么服务 (2)的什么消息 (3)需要被记录在哪里(本地文件或远端服务中)』。所以,对于我们的常规使用来说,最重要的就在于『filter(1+2)』和『action(3)』这两步。下面以一个简单的例子进行说明:

mail.info /var/log/maillog_info
# 上面这一行的含义是:由 mail 服务产生的「大于等于」 info 等级的消息,都记录到 /var/log/maillog_info 文件中。
# 其中 mail.info 起到的就是『filter-选择并过滤』消息,后面的 /var/log/maillog_info 用于指示具体的『action-操作』将消息直接写入本地文件。

接下来先不讲其它的知识点,简单直接,先上一些常见的日志收集/转发配置,方便直接取用:

# udp转发
# 功能作用:将 local6 服务产生的大于等于 notice 等级的消息,都以 UDP 协议转发到 192.168.10.199 机器上的 514 端口上。
local6.notice @192.168.10.199:514

# tcp转发
# 功能作用:将 local6 服务产生的大于等于 notice 等级的消息,都以 TCP 协议转发到 192.168.10.199 机器上的 514 端口上。
local6.notice @@192.168.10.199:514

# tcp转发+写本地文件
# 功能作用:在将匹配到的消息转发至远程服务器的同时也在本地存一份,然后停止继续处理该消息。第3行是一个停止声明,用来告诉rsyslog对该消息的处理到此为止。
local6.notice @@192.168.10.199:514
local6.notice /var/log/local6_notice
& ~

# 「tcp转发+写本地文件」的另一种写法
# 功能作用:和上面3行的功能相同,不过『action-操作』可以通过开头的&符号链接起来,可以减少匹配过滤上的性能消耗,写习惯了也相对来说更方便一点。
local6.notice @@192.168.10.199:514
& /var/log/local6_notice
& ~

# 写本地文件的高性能版本
# 功能作用:对于消息量比较大的服务,每来一条消息写一次文件对于吞吐性能会有影响,可以借助缓存提升文件的存取性能。消息先储存在速度较快的内存中(buffer),等到数据量够大了才一次性的将所有数据都写入磁盘文件,只不过由于消息是缓存在内存里的,若不正常关机导致消息未及时写到文件中,可能会造成部分数据的遗失,所以对于不是那么重要的消息可以这么干;对于重要的消息,可以借助advanced语法的指令块来进行高级复杂点的设置,在保证数据准确性的同时也提高性能。最简单的写法就是在记录的文件路径前面添加一个减号『 – 』。
local6.notice -/var/log/local6_notice
& ~

# 根据——特定源IP,进行过滤
# do this in FRONT of the local/regular rules
if $fromhost-ip startswith '192.0.1.' then /var/log/network1.log
& ~
if $fromhost-ip == '192.1.2.3' then /var/log/192.1.2.3.log
& ~

# 根据——特定服务名称和tag,进行过滤
if $syslogfacility-text == 'local6' and $syslogtag == 'Security:' then -/var/log/Security.log
& ~

# 根据——消息内容,进行过滤(将内容中包含INTF-FLAP关键字的都丢弃)。如果是不包含的话就是 !contains 在前面添加一个英文叹号即可。
if $msg contains 'INTF-FLAP' then /dev/null
& ~

再简单介绍说明一下写rsyslog配置文件的一些注意事项,方便在有更多需求的时候参考:

  1. 因为rsyslog已经发展了几十年,因为历史原因,它不可避免的有多种不同的配置格式/语法,按官方文档的说法就是:
  • basic – 简单明了的场景下建议使用
  • advanced – 稍微复杂一点的场景都建议用这种方式来写(但是rsyslog的版本不能太老,建议v8及以上版本)
  • obsolete legacy – 除非是要给自己挖坑,否则强烈不建议用这种方式来写(Do not use obsolete legacy format. It will make your life miserable. It is primarily supported in order to not break existing configurations.)
  1. 将 basic 格式转换成 advanced 格式时的注意事项:
  • 不要过度转换(Do not overdo conversion),简单场景下用 basic 格式是很好的
  • 在模块加载时进行转换(Converting Module Load)
  • 对action操作进行转换(Converting Actions)
  • 对有多个参数的action操作进行转换(Action with Multiple Parameters)
  • 对多个action操作的操作链进行转换(Converting Action Chains)——尤其是有stop声明的场景
basicadvanced
file path (/var/log/…)action(type=”omfile” file=”/var/log…/” …)
UDP forwarding (@remote)action(type=”omfwd” target=”remote” protocol=”udp” …)
TCP forwarding (@@remote)action(type=”omfwd” target=”remote” protocol=”tcp” …)
user notify (:omusrmsg:user)action(type=”omusrmsg” users=”user” …)
module name (:omxxx:..)action(type=”omxxx” …)
# 如果msg中包含 error 字符串,则把该消息转发到另一台服务器10.11.12.13上
## 历史写法1
:msg, contains, "error" @10.11.12.13
& ~

## 历史写法2
:msg, contains, "error" @10.11.12.13
& stop

## 现代写法(推荐)
if $msg contains "error" then {
        action(type="omfwd" target="10.11.12.13" protocol="udp")
        stop
}
  1. filter-匹配过滤建议用基于表达式的方式,看起来更舒服也更好维护
*.* /var/log/file1 # 传统方式
if $msg contains 'error' then /var/log/errlog # 基于表达式的方式
  1. 如果有一些简单的需求,可以关注一下rsyslog内置的函数
  • Built-in 函数的好处在于不需要额外加载就可以直接使用,而且数量还有不少,有机会的话可以试试。
  1. rsyslog的功能还是很强的,多关注一下它们的官方文档,也许会有不少新的发现
  • Output Modules
  • Input Modules
  • Parser Modules

参考链接:

Storing Messages from a Remote System into a specific File
https://www.rsyslog.com/storing-messages-from-a-remote-system-into-a-specific-file/

syslog ip ranges to specific files using rsyslog
https://serverfault.com/questions/400293/syslog-ip-ranges-to-specific-files-using-rsyslog

Configuration Formats
https://www.rsyslog.com/doc/v8-stable/configuration/conf_formats.html

Converting older formats to advanced
https://www.rsyslog.com/doc/v8-stable/configuration/converting_to_new_format.html#converting-action-chains

rsyslog Properties
https://www.rsyslog.com/doc/v8-stable/configuration/properties.html

消息过滤
https://www.rsyslog.com/doc/v8-stable/configuration/filters.html

输入模块(Input Modules)
https://www.rsyslog.com/doc/v8-stable/configuration/modules/idx_input.html

输出模块(Output Modules)
https://www.rsyslog.com/doc/v8-stable/configuration/modules/idx_output.html

将消息发送到远端的syslog服务器
https://www.rsyslog.com/sending-messages-to-a-remote-syslog-server/

在 Linux 上配置一个 syslog 服务器
https://linux.cn/article-5023-1.html

ELK实战二:日志收集利器rsyslog

=END=

, ,

《“rsyslog 简单配置学习整理”》 有 1 条评论

  1. linux 终端报Message from syslogd
    https://blog.51cto.com/xiao987334176/1910715
    `
    # 编辑 rsyslog 配置文件,注释掉将 emerg 消息通知给每个人那一行的功能
    # 重启 rsyslog 服务

    $ grep “emerg” /etc/rsyslog.conf
    # Everybody gets emergency messages
    *.emerg :omusrmsg:*
    `

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注