rsyslog详解配置

一、概述

1、简介

在centos7中,默认的日志系统是rsyslog,它是一个类unix计算机系统上使用的开源工具,用于在ip网络中转发日志信息。rsyslog采用
模块化设计,是syslog的替代品。rsyslog具有如下特点:
实现了基本的syslog协议。
直接兼容syslogd的syslog.conf配置文件
在同一台机器上支持多个rsyslogd进程
丰富的过滤功能,可将消息过滤后再转发
灵活的配置选项,配置文件中可以写简单的逻辑判断
增加了重要的功能,如使用tcp进行消息传输
有现成的前端Web展示程序。
守护进程rsyslog在启动时会读取其配置文件。管理隐患可以通过编辑/etc/rsyslog.conf、/etc/rsyslog.d/*.conf和
/etc/sysconfig/rsyslog来配置rsyslog的行为。/etc/sysconfig/rsyslog文件用于配置守护进程的运行参数,
/etc/rsyslog.conf是rsyslog的主配置文件。
rsyslog的配置文件/etc/rsyslog.conf的结构如下:
全局命令(Global dirctives):设置全局参数、如主消息尺寸、加载扩展模块等
模版(Templates):指定记录的消息格式,也用于动态文件名称生成
输出通道(Output chananels):对用户期望的消息输出进行预定义。
规则(Rules)【selector +action】:指定消息规则。在规则中可以引用之前的定义模版和输出通道

2、配置文件

#### MODULES ####
$ModLoad imuxsock # 提供本地系统日志支持(如通过logger命令)
$ModLoad imjournal # 提供对systemd journal的访问
#$ModLoad imklog # 提供内核日志支持(相当于systemed的systemd-journald.service)
#$ModLoad immark # 提供-MARK-消息功能
#### GLOBAL DIRECTIVES ####
# Use default timestamp format 使用默认日志的时间戳格式
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Include all config files in /etc/rsyslog.d/ 包含/etc/rsyslog.d/目录下的配置文件
$IncludeConfig /etc/rsyslog.d/*.conf
#### RULES ####
# Log all kernel messages to the console. 将所有的内核消息记录到控制台
# Logging much else clutters up the screen.
#kern.* /dev/console

# Log anything (except mail) of level info or higher. 将info或更高级别的消息送到/var/log/messages,除了/mail/news/authpriv/cron之外
# Don't log private authentication messages! 其中*是通配符,代表任何设备:none表示不对任何级别的消息进行记录
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access. 将authpirv设备的任何级别的信息记录到/var/log/secure中
authpriv.* /var/log/secure
# Log all the mail messages in one place. 将mail设备中的任何级别信息记录到/var/log/mailog文件中
mail.* -/var/log/maillog
# Log cron stuff 将cron设备的任何级别的信息记录到/var/log/cron文件中
cron.* /var/log/cron
# Everybody gets emergency messages 将任何设备的emerg级别或者更高的消息发送给所有正在系统上用户
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file. 将uucp和news设备的crint级别或者更高级别消息记录到/var/log/spooler文件中
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log 将和本地系统启动相关的信息记录到/var/log/boot.log文件中
local7.* /var/log/boot.log

二、实验

1、日志类别

通过修改/etc/rsyslog.conf以及/etc/rsyslog.d/xxx.conf,来控制各种日志的输出
1、日志类型
日志类型 日志内容
auth 用户认证时产生的日志
authpriv ssh、ftp等登录信息的验证信息
daemon 一些守护进程产生的日志
ftp FTP产生的日志
lpr 打印相关活动
mark 服务内部的信息,时间标识
news 网络新闻传输协议(nntp)产生的消息。
syslog 系统日志
security
uucp Unix-to-Unix Copy 两个unix之间的相关通信
console 针对系统控制台的消息。
cron 系统执行定时任务产生的日志。
kern 系统内核日志
local0~local7 自定义程序使用
mail 邮件日志
user 用户进程
Note: 不建议使用关键字 security,并且 mark仅供内部使用,因此不应在应用程序中使用

2、日志级别
日志等级 说明
7 emerg 紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。
6 alert 需要立即修复的告警。
5 crit 危险情况,例如硬盘错误,可能会阻碍程序的部分功能。
4 error/err 一般错误消息。
3 warning/warn 警告。
2 notice 不是错误,但是可能需要处理。
1 info 通用性消息,一般用来提供有用信息。
0 debug 调试程序产生的信息。
none 没有优先级,不记录任何日志消息。
从上到下,级别从低到高,记录的信息越来越少
详细的可以查看手册: man 3 syslog

3、连接符号
.xxx: 表示大于等于xxx级别的信息
.=xxx:表示等于xxx级别的信息
.!xxx:表示在xxx之外的等级的信息

4、动作
记录到普通文件或设备文件::
*.* /var/log/file.log # 绝对路径
*.* /dev/pts/0
测试: logger -p local3.info ‘KadeFor is testing the rsyslog and logger ‘ logger 命令用于产生日志
转发到远程::
*.* @192.168.0.1 # 使用UDP协议转发到192.168.0.1的514(默认)端口
*.* @@192.168.0.1:10514 # 使用TCP协议转发到192.168.0.1的10514(默认)端口
发送给用户(需要在线才能收到)::
*.* root
*.* root,kadefor,up01 # 使用,号分隔多个用户
*.* * # *号表示所有在线用户
忽略,丢弃::
local3.* ~ # 忽略所有local3类型的所有级别的日志
执行脚本::
local3.* ^/tmp/a.sh # ^号后跟可执行脚本或程序的绝对路径
# 日志内容可以作为脚本的第一个参数.
# 可用来触发报警

5、实例
# 记录mail日志等级为error及以上日志
#如果文件路径前有 “-” 则表示每次输出日志时不同步(fsync)指定日志文件。 日志先保存到缓存中,可能会因为停电导致日志丢失
mail.err -/var/log/mail_err.log
# 记录mail所有等级为warn级别的日志(仅记录warn级别)
mail.=warn /var/log/mail_err.log
# 记录kern所有日志
kern.* /var/log/kern.log
# 将mail的所有信息,除了info以外,其他的都写入/var/adm/mail
mail.*;mail.!=info /var/adm/mail
# 将日志等级为crit或更高的内核消息定向到远程主机finlandia
# 如果主机崩溃,磁盘出现不可修复的错误,可能无法读取存储的消息。如果有日志在远程主机上,可以尝试找出崩溃的原因。
kern.crit @finlandia
# 记录所有类型的warning等级及以上日志
*.warning /var/log/syslog_warn.log
# 记录mail的warning日志和kern的error日志,其他所有的info日志
*.info;mail.warning;kern.error /var/log/messages
# 记录kernel的info到warning日志
kern.info;kern.!err /var/adm/kernel-info
# 将mail和news的info级别日志写入/var/adminfo
mail,news.=info /var/adm/info
# 将所有系统中所有类型的info日志和notice日志存入/var/log/massages,mail的所有日志除外。
*.=info;*.=notice;\
mail.none /var/log/messages
# 紧急消息(emerg级别)将使用wall显示给当前所有登录的用户
*.=emerg *
# 该规则将所有alert以及更高级别的消息定向到操作员的终端,即登录的用户“root”和“joey”的终端。
*.alert root,joey

6、注意事项
Exapmple A
mail.crit,*.err /var/log/syslog_err.log
# 这样的情况,最终的结果还是会把mail的err级别日志输出到syslog_err.log
Exapmple B
mail.!warn /var/log/mail.log
# 看起来是将mail的warn以下级别的日志输出到/var/log/mail.log,其实不然,你会发现你什么也得不到。
# 官方的解释是,感叹号(就是形似这个的符号 ==> !) 就是个过滤器,你得先有东西,才能去过去,比如:
mail.*;mail.!warn /var/log/mail.log

2、rsyslog Properties模板元素属性

模板元素属性
属性 释义
msg 日志的信息内容,message。
rawmsg 不转义的日志内容。转义是默认开启的(EscapecontrolCharactersOnReceive),所以它有可能与socket中接收到的内容不同。
rawmsg-after-pri 几乎与rawmsg相同,但是删除了syslog PRI。
hostname 打印该日志的主机名。
source hostname属性的别名。
fromhost 接收的信息来自于哪个节点。这里是DNS解析的名字。
fromhost-ip 接收的信息来自于哪个节点,这里是IP,本地的是127.0.0.1。
syslogtag 信息标签。大致形如 programed[14321] 。
programname tag的一部分,就是上面的programed那个位置。
pri 消息的PRI部分-未解码(单值)
pri-text 文本形式的消息的PRI部分,并在括号中添加数值PRI(例如“local0.err<133>”)
iut InfoUnitType 一款监视器软件,在与监视器后端通信的时候使用
syslogfacility 设备信息,数字形式表示
syslogfacility-text 设备信息,文本形式表示
syslogseverity 日志严重性等级,数字形式表示
syslogseverity-text 日志严重性等级,文本形式表示
syslogpriority 同 syslogseverity
syslogpriority-text 同 syslogseverity-text
timegenerated 高精度时间戳
timereported 日志中的时间戳。精度取决于日志中提供的内容(在大多数情况下,为秒级)
timestamp 同 timereported
protocol-version IETF draft draft-ietf-syslog-protocol 中的 PROTOCOL-VERSION 字段的内容
structured-data IETF draft draft-ietf-syslog-protocol 中的 STRUCTURED-DATA 字段的内容
app-name IETF draft draft-ietf-syslog-protocol 中的 APP-NAME 字段的内容
procid IETF draft draft-ietf-syslog-protocol 中的 PROCID 字段的内容
msgid IETF draft draft-ietf-syslog-protocol 中的 MSGID 字段的内容
inputname 生成日志的输入模块的名称(如“imuxsock”、“imudp”)
jsonmesg 整个日志对象作为json表示。可能出现数据重复,譬如syslogtag包含着programname,但两者都会分别表示。所以这个属性有
一些额外开销,建议只有在实际需要的时候再用。

3、Time-Related System Properties与时间相关的属性

属性 释义
$now 当前日期时间戳,格式为YYYY-MM-DD (2020-07-08)
$year 当前年份, 四位数 (2020)
$month 当前月份, 两位数 (07)
$day 当前月份的日期,两位数 (08)
$wday 当前天数周几 :0=Sunday,...6=Saturday
$hour 当前小时(24小时机制),两位数(16)
$hhour 半小时机值,就是0-29分钟显示0,30-59分钟显示1。
$qhour 一刻钟机值,通过0-3显示,每15分钟一截。
$minute 当前分钟数,两位数(57)

4、基于属性过滤器

:<PROPERTY>, [!]<COMPARE_OPERATION>, "<STRING>" 其中 ! 表示对匹配结果取反。
该过滤器可以对所有日志的属性进行过滤(相对传统的 syslog 程序而言)
每一个属性可以使用下面的比较操作来和某一个指定的值进行从而定义过滤器。
操作符 说明
contains 属性包含指定的字符串
isequal 属性等于指定的字符串
startswith属性由指定字符串开始
regex POSIX BRE 正则表达式
ereregex POSIX ERE 正则表达式

# 过滤日志, 由:号开头
:msg, contains, “error” /var/log/error.log
:msg, contains, “error” ~ # 忽略包含error的日志
:msg, contains, “user nagios” ~
:msg, contains, “user kadefor” ~
:msg, contains, “module-alsa-sink.c: ALSA woke us up to write new data to the device, but there was actually nothing to write” ~
local3.* ~
PS.
& ~ # 忽略所有的日志

示例如下:
:msg,contains,"error" # 选择包含 error 的日志 :hostname,isequal, "host1"
# 选择主机名为 host1 的日志 :msg,!regex,"fatal .* error" # 选择不匹配指定正则表达式的日志
基于RainerScript的过滤器

格式如下:
if <EXPRESSION> then <ACTION> 其中,<EXPRESSION> 表示表达式,例如:
"$msg startswith 'DEVNAME' or $syslogfacility-text == 'local0'"。 如果表达式结果为真,则会执行相应的动作。动作

5、日志输出模板

通过模板可以更具需要来控制日志输出的样式。格式如下:
$template <TEMPLATE_NAME>,"text %<PROPERTY>% more text", [<options>]

$template 为模板指令。<TEMPLATE_NAME> 为模板名。"" 之间的文本为模板格式。 被 % 包含的文本对应相关的属性。<options> 指定
修改 模板功能的一些选项,例如 sql 或者 stdsql 会格式化文本为 SQL 查询。
动态文件输出
通过日志和/或系统属性决定输出文件名。
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log" *.* ?DynamicFile 使用 timegenerated 生成文件名,
使用该模板则在前面加上 ?。

其他例子如下:
$template DailyPerHostLogs,"/var/log/syslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages.log"
根据属性控制日志输出格式
使用下面的格式可以对模板之中的属性做各种修改操作从而定制日志的格式:
%<propname>[:<fromChar>:<toChar>:<options>]% <propname> 属性名,可用的属性名参考上文。
<fromChar> 和 <toChar> 表示对属性值字符串的操作范围。 设置 <fromChar> 为 R,<toChar> 为正则表达式即可以通过正则 表达式定
义范围。
<options> 则表示属性选项。完整的列表可以参考 这里的 Property Options 节。
一些示例如下:
%msg% # 日志的完整消息文本 %msg:1:2% # 日志消息文本的最开始两个字符 %msg:::drop-last-lf% # 日志的完整消息文本,移出最后的
换行符 %timegenerated:1:10:date-rfc3339% # 时间戳的头10个字符并按 RFC3999 标准格式化
输出日志的级别,类别,收到日志时的时间错,主机名,消息标签,消息正文, 加上换行符:
$template verbose,"%syslogseverity%,%syslogfacility%,%timegenerated%,%HOSTNAME%,%syslogtag%,%msg%\n"
输出日志来源,时间以及日志标签,正文,同时还有蜂鸣声():
$template wallmsg,"\r\nMessage from syslogd@%HOSTNAME% at %timegenerated% ...\r\n %syslogtag% %msg%\n\r"
格式化日志以便于直接进行 SQL 操作:
$template dbFormat,"insert into SystemEvents (Message, Facility,FromHost, Priority, DeviceReportedTime, ReceivedAt,
InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%',%syslogpriority%,
'%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag%')",sql
以 json 格式输出,方便程序解析:
$template jsonFormat,"{\"message\":\"%msg:::json%\",\"fromhost\":\"%HOSTNAME:::json%\",\"facility\":\"%syslogfacili
ty-text%\",\"priority\":\"%syslogpriority-text%\",\"timereported\":\"%timereported:::date-rfc3339%\",\"timegenerate
d\":\"%timegenerated:::date-rfc3339%\"}\n" 注意,message 的内容会在最前面多一个空格,其解释请参考这里。


通过模板修改日志
vim /etc/rsyslog.conf
# 创建一个名为cky_format的模板,其中 TIMESTAMP:8:15 表示timestamp属性值切片第八位到第十五位。
$template cky_format, "%$NOW% %TIMESTAMP:8:15% %hostname% %syslogseverity-text% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate cky_format
#重启rsyslog
systemctl restart rsyslog
日志格式效果样例
# NOW | timestamp:8:15| hostname| syslogseverity-text | syslogtag | msg
2020-07-09 09:59:54 mycomputer info systemd: Started System Logging Service.
# 时间戳 | 主机名 | 日志等级 | 服务进程 | 日志内容

6、文件存储模板示例

1、示例1
模板允许你指定日志信息的格式,可用于生成动态文件名,或在规则中使用。其定义如下所示,其中TEMPLATE_NAME是模板的名字,
PROPERTY是rsyslog本身支持的一些属性参数。
$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]
下面给出一个模板定义及使用的例子:
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"
*.* ?DynamicFile

2、示例2
$ModLoad imudp
$UDPServerRun 514
$template RemoteHost,"/home/rsyslog-data/%$YEAR%-%$MONTH%-%$DAY%/%FROMHOST-IP%.log
*.* ?RemoteHost
& ~

3、示例3
配置文件存储模板
$template RemoteAuditLogs,"/data/auditd/%FROMHOST-IP%/audit.log" *
$template RemoteNetworkLogs,"/data/network-log/%HOSTNAME%/network.log" *
引用模板
local6.* ?RemoteNetworkLogs
local2.* ?RemoteAuditLogs

4、示例4
排除本地主机IP日志记录,只记录远程主机。
打开/etc/rsyslog.conf文件,启用UDP协议,尽量避免修改主配置文件,我们在/etc/rsyslog.d/中新建default.conf,追加如下模板:
#### GLOBAL DIRECTIVES ####
# Use default timestamp format # 使用自定义的格式
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$template myFormat,"%timestamp% %fromhost-ip% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate myFormat
# 根据客户端的IP单独存放主机日志在不同目录,rsyslog需要手动创建
$template RemoteLogs,"/var/log/rsyslog/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
# 排除本地主机IP日志记录,只记录远程主机日志
:fromhost-ip, !isequal, "127.0.0.1" ?RemoteLogs
# 忽略之前所有的日志,远程主机日志记录完之后不再继续往下记录
& ~

7、转发到远程主机

有3种方式转发消息:
传统方式的UDP传输,有损耗
基于TCP明文的传输,只在特定情况下丢失信息,并被广泛使用
RELP传输,不会丢失信息,但只在rsyslogd 3.15.0及以上版本中可用
写法:
UDP 在主机名前加"@"
TCP 在主机名前加"@@"
RELP 在主机名前加":omrelp:"
例: *.* @192.168.0.1 将所有日志信息通过UDP协议发送到192.168.0.1

8、日志文件权限

新生成的目录和文件权限可以在配置文件设置
vim /etc/rsyslog.conf
#尽量在开头设置
$FileOwner root
$FileGroup root
$FileCreateMode 0755 #文件权限
$DirCreateMode 0755 #目录权限
$Umask 0022
重启生效
systemctl restart rsyslog

rsyslog.conf配置的系统日志文件一般都会配置日志切割,如果日志切割,则新生成的文件权限需要在日志切割中配置
/etc/logrotate.d/syslog
create 640 root root
重启
systemctl restart rsyslog

三、常用日志配置文件

/var/log/messages — 包括整体系统信息,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中。
/var/log/dmesg — 包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。可以用dmesg查看它们。
/var/log/auth.log — 包含系统授权信息,包括用户登录和使用的权限机制等。
/var/log/boot.log — 包含系统启动时的日志。
/var/log/daemon.log — 包含各种系统后台守护进程日志信息。
/var/log/dpkg.log – 包括安装或dpkg命令清除软件包的日志。
/var/log/kern.log – 包含内核产生的日志,有助于在定制内核时解决问题。
/var/log/lastlog — 记录所有用户的最近信息。这不是一个ASCII文件,因此需要用lastlog命令查看内容。
/var/log/maillog /var/log/mail.log — 包含来着系统运行电子邮件服务器的日志信息。例如,sendmail日志信息就全部送到这个文件中。
/var/log/user.log — 记录所有等级用户信息的日志。
/var/log/Xorg.x.log — 来自X的日志信息。
/var/log/alternatives.log – 更新替代信息都记录在这个文件中。
/var/log/btmp – 记录所有失败登录信息。使用last命令可以查看btmp文件。例如,”last -f /var/log/btmp | more“。
/var/log/cups — 涉及所有打印信息的日志。
/var/log/anaconda.log — 在安装Linux时,所有安装信息都储存在这个文件中。
/var/log/yum.log — 包含使用yum安装的软件包信息。
/var/log/cron — 每当cron进程开始一个工作时,就会将相关信息记录在这个文件中。
/var/log/secure — 包含验证和授权方面信息。例如,sshd会将所有信息记录(其中包括失败登录)在这里。
/var/log/wtmp或/var/log/utmp — 包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等。
/var/log/faillog – 包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。
除了上述Log文件以外, /var/log还基于系统的具体应用包含以下一些子目录:
/var/log/httpd/或/var/log/apache2 — 包含服务器access_log和error_log信息。
/var/log/lighttpd/ — 包含light HTTPD的access_log和error_log。
/var/log/mail/ – 这个子目录包含邮件服务器的额外日志。
/var/log/prelink/ — 包含.so文件被prelink修改的信息。
/var/log/audit/ — 包含被 Linux audit daemon储存的信息。
/var/log/samba/ – 包含由samba存储的信息。
/var/log/sa/ — 包含每日由sysstat软件包收集的sar文件。
/var/log/sssd/ – 用于守护进程安全服务
posted on 2023-08-04 17:07  韩山隐士  阅读(6851)  评论(0编辑  收藏  举报