前言
Rsyslog可用于接受来自各种来源(本地和网络)的输入,转换它们,并将结果输出到不同(通过模板和filter过滤)的目的地(目录文件中)
rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日 志消息。rsyslog守护进程可以被配置成两种环境,一种是配置成日志收集服务器, rsyslog进程可以从网络中收集其它主机上的日志数据,这些主机会将日志配置为发 送到另外的远程服务器。rsyslog的另外一个用法,就是可以配置为客户端,用来过 滤和发送内部日志消息到本地文件夹(如/var/log)或一台可以路由到的远程rsyslog 服务器上。
系统中的绝大多数日志文件是由 rsyslogd 服务来统一管理的,只要各个进程将信息 给予这个服务,它就会自动地把日志按照特定的格式记录到不同的日志文件中。有一部分日志不是由 rsyslogd 服务来管理的,比如 apache 、ftpd服务, 它的日志是由 Apache 软件自己产生并记录的,并没有调用 rsyslogd 服务。但是为 了便于读取,apache 日志文件的格式和系统默认日志的格式是一致的。还有就是业务微服务的日志,是通过业务代码自己记录的。
配置文件格式详解
rsyslogd 服务是依赖其配置文件 /etc/rsyslog.conf 来确定哪个服务的什么等级的日志信息会被记录在哪个位置的。也就是说日志服务的配置文件中主要定义了服务的名称、日志等级和日志记录位置。
authpriv.* /var/log/secure
#服务名称[连接符号]日志等级 日志记录位置#认证相关服务.所有日志等级 记录在/var/log/secure日志中
*.* @8.8.8.8:514
#第一个*表示日志类型,有mail,authpriv,cron等,*表示所有日志;第二个*表示日志级别,主要有info,debug,emerg等,*表示包含所有级别;即*.*表示所有日志的所有级别;
# 所有日志的所有级别通UDP协议转发到日志服务器8.8.8.8中
服务名称:
我们首先需要确定 rsyslogd 服务可以识别哪些服务的日志,也可以理解为以下这些 服务委托 rsyslogd 服务来代为管理日志。这些日志服务名称是rsyslogd服务自己定义的,并不是实际的Linux的服务。当有服务需要由rsyslogd服务来帮助管理日志时,只需要调用这些服务名称就可以实现日志的委托管理。可以使用命令 "man 3 syslog" 来查看。这些服务如表 1 所示。
连接符号:
连接符号可以被识别为以下三种。
- “.”代表只要比后面的等级高的(包含该等级)日志都记录。比如,“cron.info”代表cron服务产生的日志,只要日志等级大于等于info级别,就记录。---常用
- “.=”代表只记录所需等级的日志,其他等级的日志都不记录。比如,“*.=emerg” 代表人和日志服务产生的日志,只要等级是emerg等级就记录。这种用法极少见了解就好。
- “.!”代表不等于,也就是除该等级的日志外,其他等级的日志都记录。
日志等级:
日志记录位置:
- 日志文件的绝对路径。这是最常见的日志保存方法,如“/var/log/secure”就是用 来保存系统验证和授权信息日志的。
- 系统设备文件。如“/dev/lp0”代表第一台打印机,如果日志保存位置是打印机设备,当有日志时就会在打印机上打印。
- 转发给远程主机。因为可以选择使用 TCP 和 UDP 协议传输日志信息,所以有两种发送格式:如果使用“@192.168.0.210:514”,就会把日志内容使用 UDP 协议发送到192.168.0.210 的 UDP 514 端口上;如果使用“@@192.168.0.210: 514”,就会把日志内容使用 TCP 协议发送到 192.168.0.210 的 TCP 514 端口 上,其中 514 是日志服务默认端口。当然,只要 192.168.0.210 同意接收此日志,就可以把日志内容保存在日志服务器上。
- 忽略或丢弃日志。如果接收日志的对象是“~”,则代表这个日志不会被记录,而 被直接丢弃。如“local3.* ~”代表忽略 local3 服务类型所有的日志都不记录。
配置文件内容详解
由三部分组成:严格按照配置段位置添加配置 ;
-
MODULES:定义了模块的选修,这个部分主要用来配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。
# 加载模块
$ModLoad imfile
# 设置轮询时间周期,单位秒,即每隔10s轮训一次日志新内容
$InputFilePollInterval 10
# 工作目录,如生成状态文件
$WorkDirectory /var/log/syslog/work
# 指定监控文件路径
$InputFileName /var/log/ftpd.log
# 设置状态文件名,跟踪受监控文件那部分已经处理,当前处理到什么位置,当前于指针。
$InputFileStateFile stat-ftpd-access
# rsyslog自己指定的服务名称,当有服务需要由rsyslogd服务来帮助管理日志时,只需要调用这些服务名称就可以实现日志的委托管理
$InputFileTag ftpd-access
# 指定读取日志的级别
$InputFileSeverity info
# 设置写入状态文件的周期,单位行。即读取25000行时写入一次状态文件
$InputFilePersistStateInterval 25000
# 可以理解为日志类型local 1~7
$InputFileFacility local5
#设置日志文件中的用户属性字段的归属用户组
$PrivDropToGroup adm"
# 启动文件监视器,以便实时读取日志文件的新消息。
$InputRunFileMonitor
具体输入、输出模块详情请参考:
imfile: 文本文件输入模块 — Rsyslog 文档
服务端配置:
一般来说选择TCP都是OK的,除非忍受部分丢失,在意影响性能,可以改用UDP。
但是注意:如果你的消息每行大小超过了4k,只能用TCP。这是因为UDP栈大小限制的。
引用官方有关 MaxMessageSize 的描述:
#Provides UDPsyslog reception
$ModLoad imudp
$UDPServerRun 514
#TCP syslog
$ModLoad imtcp
$InputTCPServerRun 514
通常情况下syslog服务端会接受来自不通客户端的日志, 那个就需要通过模版配置加以区分:
创建Remote模版,并引用,如果是来自7.7.7.7的日志,存在在/data/log/7.7.7.7/7.7.7.7_2024-07-07.log中
$template Remote,"/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
:fromhost-ip, isequal, "7.7.7.7" ?Remote
配置黑白名单
$AllowedSender tcp, 192.168.30.0/24 允许 30.0网段内的主机以tcp协议来传输
# 某些新版本的rsyslog配置格式如下
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514"
注1:可能由于防火墙导致日志发送失败,可于客户端及服务器端查看514端口是否能正常使用,Centos7中使用如下命令:
firewall-cmd –-query-port=514/udp,tcp类似
输出no,表示没有启用,则添加514端口于防火墙,tcp类似
firewall-cmd –add-port=514/udp
注2:如: rsyslog 监听UDP 514端口,还需要设置 SELinux,否则该端口无法使用。
/etc/sysconfig/rsyslog文件中,修改
SYSLOGD_OPTIONS="-m240 -r"
其中-r表示接受外部日志的写入。
客户端配置:
*.* @8.8.8.8:514
#第一个*表示日志类型,有mail,authpriv,cron等,*表示所有日志;第二个*表示日志级别,主要有info,debug,emerg等,*表示包含所有级别;即*.*表示所有日志的所有级别;
# 所有日志的所有级别通UDP协议转发到日志服务器8.8.8.8中
*.info;mail.none;authpriv.none;cron.none @@10.145.254.175:514
# 除过mail、authpriv和cron的info级别以上的日志通过TCP协议转发到10.145.254.175日志服务器上