系统日志架构

操作系统内核和程序记录了发生的时间日志,这些日志用于审核系统并解决问题。
日志以文本方式保存在/var/log目录中!
可以使用普通文本实用程序(如less和tail)检查这些日志。

而RHEL内置了基于Syslog协议的标准日志记录系统。在RHEL8中systemd-journald和rsyslog服务负责处理syslog消息。

systemd-journald服务是操作系统事件记录体系结构的核心,收集系统各方面事件消息,包括内核、引导过程早期阶段的输出、守护程序启动和运行时输出、syslog事件,然后将它们重组为标准格式,并吸入结构化的索引系统日志中。(不能进行自定义)

rsyslog服务读取systemd-journald日志,然后记录到日志文件,或根据自己的配置将它们转发到其他服务。(可根据自定义进行记录)

/message :大多数系统日志消息记录在次数!
/secure   :与安全性和身份验证事件相关的syslog消息
/maillog :与邮件服务器相关的syslog消息
/cron     :与调度作业执行相关的syslog消息。(定时器)
/boot.log:与系统启动相关的非syslog控制台的消息。

562fd934ff8db532d1cb38903fbe8a03.png

查看rsyslog日志

日志格式

每一条日志消息都可以通过消息类型facility和priority分类,参考rsyslog.conf(5)。
格式:消息类型facility.(连接符号)priority 日志处理方式(action)

消息类型facility:
auth pam产生的日志
authpriv ssh/ftp等登录信息的验证信息
cron 时间任务相关
kern 内核
lpr 打印
mail 邮件
mark(syslog)-rsyslog 服务内部的信息,时间标识
news 新闻组
user 用户程序产生的相关信息
local 0~7 自定义的日志设备,本地使用

  • 日志的级别
    ea8e30ac573b5793189e1dd477b6585d.png

从下到上,级别由低到高!

连接符号

.xxx:表示大于等于xxx级别的消息
.=xxx:表示等于xxx级别的消息
.!xxx:表示在xxx之外的等级的消息

查看syslog日志

配置文件/etc/rsyslog.conf(主配置文件) 和/etc/rsyslog.d/*.conf (自定义配置文件(副配置文件))
当配置修改成功后,需要重启服务:

systemctl  restart  rsyslog.service

查看主配置文件

vim /etc/rsyslog.conf

c2a76515a9b8dad2da9d75856959e063.png
上图中的-的作用是:异步存储。没有带这个符号的是会立即存储

日志轮询

日志通过logrotate轮询,以确保日志不会充满/var/log所在的文件系统。
日志轮询通过扩展的日志重命名文件:旧的messages可能是messages-20190103,如果当时时间是20190103,一但日志被轮询,就会创建新的日志,并通知进程日志写入到新的日志文件中。

轮询一定次数后,旧日志文件会被删除释放空间!
cron.job每天执行一次logrotate程序确认日志是否需要轮询!

logrotate配置文件:/etc/logrotate.conf和/etc/logrotate.d

查看日志

动态查看日志:

tail  -f  /var/log/secure
实时观察时,我们可以执行下面的命令观看
ssh student@hemain

如果不加-f,则只能看尾部10行;加-f则可以动态查看。
日志格式如下:

Aug 12 15:38:44 hemain sshd[9234]: Accepted password for student from 192.168.174.101 port 51212 ssh2

第一部分:时间(Aug 12 15:38:44)
第二部分:机器(hemain)
第三部分:守护程序,哪个守护进程(sshd9234)
第四部分:记录对应的信息

手动写日志

如何手动写日志呢?
第一步:查看vim /etc/rsyslog.conf文件,有一个local7.*(会存储到boot.log文件中)。我们需要做一个自定义配置。
第二步:切换至root用户,动态查看boot.log日志
tail -f /var/log/boot.log
第三步:另一个终端手动发日志:
logger -p local7.err 'hello this is aerr.'
第四步:回到动态查看日志的终端是否已经写入数据

继续探索:
第一步:我们可以在/etc/rsyslog.conf文件中加一条语句:

local1.*                /var/log/local1

第二步:重启服务

systemctl restart rsyslog.service

第三步:查看 ls /var/log/local1文件是否存在
不存在的!
第三步:所以tail -f /var/log/local1是没有内容的!
第四步:直接手动往该文件中写日志
logger -p local1.err 'this is a local1 err'
第五步:重新去看日志就有内容了!
tail -f /var/log/local1

查看systemd-journald日志

journald基础

结构化日志,systemd-journald日志它是保存在结构化日志中的,我们不能像查看纯文本的方式去看,它是通过下面的命令进行查看的:

journalctl
q键,退出
空格键,翻页
G键,显示到最后一行
右键,向右翻页

该命令普通用户和root用户都可以使用,但是普通用户是受限的,它只能查看到它能看到的!

注意:它默认情况下,只记录机器启动到现在产生的日志!
默认关机后不会保存原来的日志!

journalctl命令的使用

查看journald日志

journalctl  -d  0/1/2/3

查看第几次启动的journald日志(如果保存的话)

journalctl -n 5

查看journald日志的最后5条

journalctl  -f

动态查看jouranld日志

journalctl  -p  err

查看指定级别的日志,比如error

journalctl --since today

查看从某个时间到当前的日志

journalctl --since "2019-02-10 20:30:00" --until "2019-02-13 12:00:00"

查看从某一个时间到某个时间的日志

//最近一个小时产生的日志
journalctl  --since  "-1 hour"

保留systemd-journald日志

默认情况下systemd-journald日志只保存机器启动至现在的日志,那如何永久保留systemd-journald日志呢?

systemd-journald配置文件位置:/etc/systemd/journald.conf

第一步:查看journald的配置文件

vim /etc/systemd/journald.conf

第二步:重新打开一个终端

man journald.conf

查找Storage是什么意思?/Storage

Storage可以设置四个值:
volatile               将日志保存在内存中,但服务重启后内存会清空
persistent            将日志保存在磁盘中,可永久保存在/var/log/journal
auto                   如文件/var/log/journal存在则保存,否则不保存
none                  不保存日志
第三步:将/etc/systemd/journald.conf文件中的Storage值设置为persistent即可

验证环节:
第一步:我们说不永久保存会存储在/run/log/journal/文件里
我们可以查看文件系统:

df  -h

其中只有/dev/vda1是永久保存的,其他都是保存在内存中。我们的run/目录对应的是tmpfs,所以在重启是它会清除!
为什么/var/log会永久保存呢?是因为它对应的是/dev/vda1
第二步:我们来看下/var/log/journal是否存在?

ls  /var/log/jou*

第三步:重启systemd-journald

systemctl restart systemd-journald

第四步:重启完后,我们可以看下这个目录有了没?

ls  /var/log/jou*

注意:默认情况,journal日志不允许超过文件系统10%和文件系统剩余空间小于15%时要见效

维护准确的时间

生产环境中系统的时间是非常重要的!排查日志问题等

系统中如何查看当前的时间:

date
date +%Y
date +%Y%m
date +%Y%m%d
date +%x

date也可以进行设置时间

date -s "Mon Feb 24 17:54:25 CST 2020"

timedatectl设置时间

timedatectl      查看当前时间
man timedatectl      查看timedatectl的使用方法

查看拥有的时区:

teimedatectl list-timezones

设置时区

timedatectl set-timezone  "Africa/Asmara"

与网络服务器对时

我们要使用的是chronyd软件包!

systemctl  status chronyd.service

服务已经启动
接下来,我们看下它的配置文件

vim /etc/chrony.conf

在/etc/chrony.conf中有2类时间源:server和peer
其中server是本地之上ntp服务器,peer是本地相同层次的服务器。

利用server设定上层NTP服务器,格式如下:

server [IP or hostname]  [perfer]
perfer:表示优先级最高
burst:当一个远程NTP服务器可用时,向它发送一系列的并发包进行检测。
iburst:当一个远程NTP服务器不可用时,向它发送一系列的并发包进行检测。

配置完成后,需要重启服务

systemctl restart chronyd.service

查看是否对时?

chronyc sources -v