日常工作中,常遇到些问题,会查看Linux的系统日志,日志多种多样,boot.log, messages, auth.log, syslog等等,但每次出现问题总是凭借直觉和经验去一个一个翻,是下下策。搭建ELK,Loki等日志分析系统也是极好的,但是体积太大了,需要考虑和维护的东西也就更多。故而通过一些更轻量级的配置,加上自己的一些理解分析,想实现一套日志分析系统。而针对系统模块的日志,首当其冲的是要搞定rsyslog。
日志整理
对日志进行分析,首先第一步要规整日志。
- /etc/rsyslog.conf 是rsyslog服务的总配置文件
- /etc/rsyslog.d 该目录是单独配置的rsyslog配置文件
个人建议,将所有的rule都配置在该目录下,在/etc/rsyslog.conf中不写rule。
日志类别
- 系统日志
通过修改/etc/rsyslog.conf以及/etc/rsyslog.d/xxx.conf,来控制各种日志的输出
日志类型 |
日志内容 |
auth |
用户认证时产生的日志 |
authpriv |
ssh、ftp等登录信息的验证信息 |
daemon |
一些守护进程产生的日志 |
ftp |
FTP产生的日志 |
lpr |
打印相关活动 |
mark |
服务内部的信息,时间标识 |
news |
网络新闻传输协议(nntp)产生的消息。 |
syslog |
系统日志 |
security |
|
uucp |
Unix-to-Unix Copy 两个unix之间的相关通信 |
console |
针对系统控制台的消息。 |
cron |
系统执行定时任务产生的日志。 |
kern |
系统内核日志 |
local0~local7 |
自定义程序使用 |
|
邮件日志 |
user |
用户进程 |
日志等级 |
说明 |
|
7 |
emerg |
紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。 |
6 |
alert |
需要立即修复的告警。 |
5 |
crit |
危险情况,例如硬盘错误,可能会阻碍程序的部分功能。 |
4 |
error/err |
一般错误消息。 |
3 |
warning/warn |
警告。 |
2 |
notice |
不是错误,但是可能需要处理。 |
1 |
info |
通用性消息,一般用来提供有用信息。 |
0 |
debug |
调试程序产生的信息。 |
none |
没有优先级,不记录任何日志消息。 |
配置示例
# 记录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或更高的内核消息定向到远程主机master
# 如果主机崩溃,磁盘出现不可修复的错误,可能无法读取存储的消息。如果有日志在远程主机上,可以尝试找出崩溃的原因。
kern.crit @master
# 记录所有类型的warning等级及以上日志
*.warning /var/log/syslog_warn.log
# 记录mail的warning日志和kern的error日志,其他所有的info日志
*.info;mail.warning;kern.error /var/log/messages
# 记录kernel的info到warning日志
;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 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,但两者都会分别表示。所以这个属性有一些额外开销,建议只有在实际需要的时候再用。 |
Time-Related System Properties
与时间相关的系统属性(以 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) |
通过模板修改日志:
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.
# 时间戳 | 主机名 | 日志等级 | 服务进程 | 日志内容
独立的haproxy日志配置
其中local3.* 与配置文件中的日志配置保持一致
[root@node04 haproxy-1.8.20]# vim /etc/rsyslog.conf
local3.* /var/log/haproxy.log
$ModLoad imudp
$UDPServerRun 514
[root@node04 haproxy-1.8.20]# systemctl restart haproxy
[root@node04 haproxy-1.8.20]# systemctl restart rsyslog
[root@node04 haproxy-1.8.20]# ll /var/log/ha*
-rw-------. 1 root root 129 Jul 15 01:22 /var/log/haproxy.log