Rsyslog的全称是 rocket-fast system for log,它提供了高性能,高安全功能和模块化设计。rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给目标文件。
特点:
1.多线程
2.可以通过许多协议进行传输UDP,TCP,SSL,TLS,RELP;
3.直接将日志写入到数据库;
4.支持加密协议:ssl,tls,relp
5.强大的过滤器,实现过滤日志信息中任何部分的内容
6.自定义输出格式;
配置文件/etc/rsyslog.conf主要有3个部分
MODULES :模块
GLOBAL DRICTIVES :全局设置
RULES:规则
#rsyslog v3 config file [兼容版本号]
#### MODULES #### 加载模块
$ModLoad imuxsock # 本地系统日志 (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
# 允许514端口接收使用UDP协议转发过来的日志
#$ModLoad imudp.so
#$UDPServerRun 514
# 允许514端口接收使用TCP协议转发过来的日志
#$ModLoad imtcp.so
#$InputTCPServerRun 514
#### GLOBAL DIRECTIVES ####
# 定义日志格式默认模板
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on
#### RULES ####
# 关于内核的所有日志都放到/dev/console(控制台)
#kern.* /dev/console
# 记录所有日志类型的info级别以及大于info级别的信息到 /var/log/messages,但是mail邮件信息,authpriv验证方面的信息和cron时间任务相关的信息除外
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# authpriv验证相关的所有信息存放在/var/log/secure
authpriv.* /var/log/secure
# 邮件的所有信息存放在/var/log/maillog; 这里有一个-符号, 表示是使用异步的方式记录, 因为日志一般会比较大
mail.* -/var/log/maillog
# 计划任务有关的信息存放在/var/log/cron
cron.* /var/log/cron
# 记录所有的大于等于emerg级别信息, 以wall方式发送给每个登录到系统的人(* 代表所有在线用户 )
*.emerg *
# 记录uucp,news.crit等存放在/var/log/spooler
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log 启动的相关信息
local7.* /var/log/boot.log
# 转发规则
# remote host is: name/ip:port, port optional (e.g. 192.168.0.1:514)
*.* @@remote-host:514
# @@表示通过tcp协议发送 @表示通过udp进行转发
facitlity.priority Target
auth #pam产生的日志,认证日志
authpriv #ssh,ftp等登录信息的验证信息,认证授权认证
cron #时间任务相关
kern #内核
lpr #打印
mail #邮件
mark(syslog) #rsyslog服务内部的信息,时间标识
news #新闻组
user #用户程序产生的相关信息
uucp #unix to unix copy, unix主机之间相关的通讯
local 1~7 #自定义的日志设备
===============================================================
#priority: 级别日志级别:
=====================================================================
7 debug #有调式信息的,日志信息最多
6 info #一般信息的日志,最常用
5 notice #最具有重要性的普通条件的信息
4 warning, warn #警告级别
3 err, error #错误级别,阻止某个功能或者模块不能正常工作的信息
2 crit #严重级别,阻止整个系统或者整个软件不能正常工作的信息
1 alert #需要立刻修改的信息
0 emerg, panic #内核崩溃等严重信息
none #什么都不记录
###从上到下,级别从低到高,记录的信息越来越少,如果设置的日志内性为err,则日志不会记录比err级别低的日志,只会记录比err更高级别的日志,也包括err本身的日志。
=====================================================================
Target:
#文件, 如/var/log/messages
#用户, root,*(表示所有用户)
#日志服务器,@172.16.22.1
#管道 | COMMAND
连接符号
.xxx: 表示大于等于xxx级别的信息
.=xxx:表示等于xxx级别的信息
.!xxx:表示在xxx之外的等级的信息
处理方式
/var/log/file 发送到日志文件
@@192.168.0.1 发送到TCP server
@192.168.0.1 发送到UDP server
user1,user2 发送到在线用户user1,user2
~ 丢弃该日志
^/path/script 执行的脚本,^后面跟可以执行的脚本,日志内容可以作为脚本的第一个参数,可以用来触发告警
结合使用的 rule 示例:
# 记录mail日志等级为error及以上日志
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
Rsyslog 预定义了一些属性,来代表消息中的信息,我们可以在定义输出格式、动态文件名的时候使用到这些属性。
属性 | 释义| |
---|---|
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 | 设备信息,文本形式表示 |
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,但两者都会分别表示。所以这个属性有一些额外开销,建议只有在实际需要的时候再用。 |
与时间相关的系统属性(以 2020-07-08 16:57:36
为例)
属性 | 释义 |
---|---|
$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) |
Rsyslog可以使用syslog标准的过滤规则,同时自己添加了一些扩展。比如可以在输出中指定rsyslog自己的处理方式,可以指定输出template
# 过滤日志, 由:号开头
: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.* ~
& ~ # 忽略所有的日志.
通过模板修改日志
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.
# 时间戳 | 主机名 | 日志等级 | 服务进程 | 日志内容
文件存储模板示例
1.排除本地主机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
# 忽略之前所有的日志,远程主机日志记录完之后不再继续往下记录
& ~
有3种方式转发消息:
传统方式的UDP传输,有损耗
基于TCP明文的传输,只在特定情况下丢失信息,并被广泛使用
RELP传输,不会丢失信息,但只在rsyslogd 3.15.0及以上版本中可用
写法:
UDP 在主机名前加"@"
TCP 在主机名前加"@@"
RELP 在主机名前加":omrelp:"
例: . @192.168.0.1 将所有日志信息通过UDP协议发送到192.168.0.1