RHCE9学习指南 第18章 日志

2024-01-10 13:33:24

在这里插入图片描述

日志中记录了各种各样的问题,所以读取日志是检测并排除故障的一个重要方式,日志文件默认放在/var/log/目录下。不同的问题要读取不同的日志,例如,邮件发不出去,可以读取日志文件件/var/log/maillog;要查看哪些用户试图用ssh登录到本机,可以读取/var/log/secure日志文件。

在RHEL9/CentOS9中,日志是由rsyslogd服务管理的,不同类型的日志内容放在哪个文件中,由/etc/rsyslog.conf决定。

在/etc/rsyslog.conf中可以定义一系列的规则,决定不同类型的日志保存在哪个文件中。
定义规则的格式如下。
日志类别.日志级别标准线 文件
如果某个应用程序的日志级别 大于等于 日志类别后面的级别标准线,则日志会被记录到指定的文件中。
日志的类别包括以下几种。

(1)auth:用户认证时产生的日志
(2)authpriv:ssh、ftp等登录信息的验证信息
(3)daemon:一些守护进程产生的日志
(4)ftp:FTP产生的日志
(5)lp:打印相关活动
(6)mark:服务内部的信息,时间标识
(7)news:网络新闻传输协议(nntp)产生的消息。
(8)syslog:系统日志
(9)security:安全相关的日志
(10)uucp:Unix-to-Unix Copy 两个UNIX之间的相关通信
(11)console:针对系统控制台的消息。
(12)cron:系统执行定时任务产生的日志。
(13)kern:系统内核日志
(14)local0~local7:自定义程序使用
(15)mail:邮件日志
(16)user:用户进程

日志级别包括以下几种。

	(1)emerg:恐慌状态,如关机、重启系统等
	(2)alert:紧急状态
	(3)crit:临界状态
	(4)err:其他错误
	(5)warning:警告
	(6)notice:需要调查的事项
	(7)info:一般的事件信息
	(8)debug:仅供调试

不需要详细了解具体每个级别的意义,只需知道这些级别从上往下是越来越低的。emerg级别最高,debug级别最低。

在写程序时,可以在程序的代码中定义一个日志信息,这个日志应该属于哪个类别,以及级别是什么。当程序中这个代码块被执行时,rsyslog决定这个日志会写入哪个文件中。

为了好理解,先看个例子。假设rsyslog.conf终已经定义了4条日志规则,如图18-1所示。
file
图18-1 了解日志的类别和级别
这里定义了不同类别的日志记录的最低标准,以及记录到哪个文件中。例如,第四条规则local5类别的日志,如果级别大于等于info,会记录到file4.log中,如图18-2所示。
file
图18-2 了解日志的类别和级别
现在有一个A应用,在其代码中指定它所使用的日志类别是local5,所以在A应用的日志生成时,会使用第四条规则。因为第四条规则指定的是如何记录local5级别的日志。

那么,A应用所产生的日志到底会不会被第四条规则记录呢?主要由A应用的日志级别是否达到规则要求的最低标准。A应用产生的日志级别为debug,而规则4要记录的最低级别是info,debug的级别低于info。所以,就是A产生的日志没达到规则四的最低“分数线”,所以是不会被记录到file4.log中的。

18.1 rsyslog的配置

用vim编辑器打开/etc/rsyslog.conf,往下找到RULES关键字#### RULES ####,下面定义的都是记录日志的规则,去掉对应的注释行之后内容如下。

*.info;mail.none;authpriv.none;cron.none        /var/log/messages

上面这行 .info中的表示所有类别的日志,都可以匹配到这条规则,但是要求应用程序的日志级别要达到info以上才会记录到/var/log/messages中。

但是这里的*要排除mail、authpriv和cron这三个类别,即这三个类别的日志不匹配这条规则,因为这三个类别后面写的级别是none。

authpriv.*                              		/var/log/secure

这条规则的意思是,只要应用程序产生日志的是authpriv类别的就匹配这条规则,不管日志是哪个级别的,日志记录到/var/log/secure中。

mail.*                                   		-/var/log/maillog

这条规则的意思是,只要应用程序产生日志的是mail类别的就匹配这条规则,不管日志是哪个级别的,日志记录到/var/log/maillog中。

cron.*                                   		/var/log/cron

这条规则的意思是,只要应用程序产生日志的是cron类别的就匹配这条规则,不管日志是哪个级别的,日志记录到/var/log/cron中。

*.emerg                                         :omusrmsg:*

这条规则的意思是,不管应用程序产生日志的是哪个类别的,只要日志级别是emerg,则会通知所有人(所有终端都会有消息提醒)。

uucp,news.crit                                  /var/log/spooler

这条规则的意思是,只要应用程序产生日志的是uucp或news类别的就匹配这条规则,不管日志是哪个级别的,日志记录到/var/log/spooler中。

local7.*                                        /var/log/boot.log

这条规则的意思是,只要应用程序产生日志的是local7类别的就匹配这条规则,不管日志是哪个级别的,日志记录到/var/log/boot.log中。

下面开始自己写一条规则,在vim编辑模式下,在上面规则的后面添加一条内容如下。

local6.info                                    /var/log/xx.log

这条规则的意思是,只要应用程序产生日志的是local6类别的就匹配这条规则,但是要求日志的级别要大于等于info才能记录到/var/log/boot.log中。

保存退出之后,重启rsyslog,命令如下。

[root@server ~]# systemctl restart rsyslog
[root@server ~]# 

下面模拟一个应用程序产生一个类别为local6、级别为debug的日志,命令如下。

[root@server ~]# logger -p  local6.debug  "1111"
[root@server ~]#

这个命令的意思是,模拟产生一个类别为local6、级别为debug的日志,日志的内容为1111。
这个日志应该会使用配置文件/etc/rsyslog.conf中所定义的如下两条规则。

*.info;mail.none;authpriv.none;cron.none        /var/log/messages
local6.info                                     /var/log/xx.log

第一条规则能匹配到任何类别,但是要求info级别以上的日志,第二条能匹配local6类别,info以上级别的日志。但模拟日志仅仅是debug级别的,不达标,所以模拟日志是不会被记录的,如下所示。

[root@server ~]# ls /var/log/xx.log
ls: 无法访问'/var/log/xx.log': 没有那个文件或目录
[root@server ~]#

现在重新模拟一个local6级别为info的日志,日志内容为2222,命令如下。

[root@server ~]# logger -p local6.info "2222"
[root@server ~]#

按照上面的分析,这条日志会被记录的,且会记录到/var/log/messages和/var/log/xx.log两个日志文件中,下面来验证一下。

[root@server ~]# grep 2222 /var/log/messages
Oct  5 19:36:50 server root[378436]: 2222
[root@server ~]# 
[root@server ~]# cat /var/log/xx.log 
Oct  5 19:36:50 server root[378436]: 2222
[root@server ~]#

可以看到,这条日志被记录到两个文件中了。
现在重新模拟一个local6级别为err的日志,日志内容为3333,命令如下。

[root@server ~]# logger -p local6.err "3333"
[root@server ~]#

然后确认这日志是否被记录,命令如下。

[root@server ~]# grep 3333 /var/log/messages
Oct  5 19:39:40 server root[378477]: 3333
[root@server ~]# cat /var/log/xx.log 
Oct  5 19:36:50 server root[378436]: 2222
Oct  5 19:39:40 server root[378477]: 3333
[root@server ~]#

可以看到,日志现在已经被记录了。

18.2 查看日志

前面分析了rsyslog是如何归纳日志信息的,下面我们看下如何查看日志。
第一种方式就是通过查看日志文件,因为不同类别的日志被记录到不同的日志文件了,所以我们需要查看对应的日志文件即可。
(1)查看系统的启动过程,可以查看/var/log/boot.log。
(2)查看谁通过ssh、ftp等登录系统或尝试登录系统,可以通过/var/log/secure查看。
(3)查看邮件服务器的收发邮件的情况,可以通过/var/log/maillog查看。
(4)查看安装或卸载了哪些包,可以通过/var/log/dnf.log查看。
大部分的日志信息都是记录在/var/log/messages中的,可以在此日志文件中查找相关信息。
除以上文件查看日志的方式外,可以通过journalctl查看,命令如下。

[root@server ~]# journalctl 
-- Logs begin at Tue 2023-12-19 01:08:42 CST, end at Thu 2023-12-19 09:01:01 CST. --
1219 01:08:42  server.rhce.cc rsyslogd[10878]: processing: omfile: creat>
... 大量输出...
[root@server ~]#

直接输入“journalctl”,会显示系统所有的日志。此时显示了一页的日志,按【Esc】可以退出来,按【Enter】键可以一行一行地往下继续显示,按空格键可以一页一页地往下显示。
如果按想看最新的日志,命令如下。

[root@server ~]# journalctl -f
-- Logs begin at Tue 2023-12-19 01:08:42 CST. --
12月19 08:56:40 server.rhce.cc dnf[397697]: Updating Subscription Management repositories.
1219 08:56:40 server.rhce.cc dnf[397697]: Unable to read consumer identity
	...输出...
1219 09:01:01 server.rhce.cc run-parts[397744]: (/etc/cron.hourly) finished 0anacron
1219 09:51:49 server.rhce.cc cupsd[1130]: REQUEST localhost - - "POST / HTTP/1.1" 200 184 Renew-Subscription client-error-not-found

此处日志仍然处于日志打开状态,不会看到终端提示符,如果此时日志有变化,这里会继续输出。按【Ctrl+c】组合键退出。

如果想查看日志中某级别以上的日志,可以加上"-p 级别" 选项来查看。例如,查看emerg级别的日志,命令如下。

[root@server ~]# journalctl  -p emerg
-- Logs begin at Tue 2023-12-19 01:08:42 CST, end at Thu 2023-12-19 09:51:49 CST. --
-- No entries --
[root@server ~]#

这里没有输出,表示的是系统中暂时没有emerg级别的日志。我们先模拟一个类别为local6级别为emerg的日志,命令如下。

[root@server ~]# logger -p local6.emerg "xxxx"
[root@server ~]# 
Broadcast message from systemd-journald@server.rhce.cc (Thu 2023-12-19 10:00:42 CST):

root[398250]: xxxx

 root[398250]:xxxx

此处按下按【Enter】键可以显示提示符

[root@server ~]# 

然后再次查看所有emerg级别以上的日志,命令如下。

[root@server ~]# journalctl  -p emerg
-- Logs begin at Tue 2023-12-19 01:08:42 CST, end at Thu 2023-12-19 10:01:01 CST. --
1219 10:00:42 server.rhce.cc root[398250]: xxxx
[root@server ~]#

这里可以就能看到有一条emerg级别的日志了。
journalctl还可以查看某个时间段的日志,格式如下。
journalctl --since "时间1" --until "时间2"
这里since指的是起始时间,until指的是终止时间,整体意思是查看的是时间1和时间2之间的日志。例如,要查看自2023-12-19 20:00:00 到2023-12-20 10:18:00之间且级别要高于等于err的日志,命令如下。

[root@server ~]# journalctl  -p err --since "2023-12-19 20:00:00" --until "2023-12-20 10:18:00"
-- Logs begin at Tue 2023-12-19 01:08:42 CST, end at Thu 2023-12-20 10:01:01 CST. --
1220 00:01:40 server.rhce.cc systemd[1]: Failed to start dnf makecache.
1220 03:57:40 server.rhce.cc systemd[1]: Failed to start dnf makecache.
1220 07:16:20 server.rhce.cc systemd[1]: Failed to start dnf makecache.
1220 10:00:42 server.rhce.cc root[398250]: xxxx
[root@server ~]#

如果没有写until,则查看的是从since所指定的时间点到现在的日志。

作业:

作业1:在server2上定义一条规则,要求当出现类别为local7且级别大于等于alert的日志时保存在文件/var/log/test1.log里。
答案:
使用vim编辑器打开/etc/rsyslog.conf,在"#### RULES ####"的下一行添加新的内容如下:

local7.alert            /var/log/test1.log

保存并退出。
重启rsyslogd服务,命令如下。

[root@server2 ~]# systemctl restart rsyslog
[root@server2 ~]#

模拟产生一个类别为local7且级别为alert的日志,然后日志是否保存在指定的文件里了。

[root@server2 ~]# cat /var/log/test1.log 
Feb  1 13:29:19 server2 root[8135]: this is a test 111
[root@server2 ~]#

可以看到日志已经正确的写进来了。

作业2:请列出今天的且级别为alert以上的日志。
答案
通过jouranlctl可以直接查看日志,命令如下。

[root@server2 ~]# journalctl  -p alert  -S today
-- Logs begin at Tue 2023-12-19 09:59:49 CST, end at Tue 2023-12-19 13:29:19 CST. --
1219 13:29:19 server2 root[8135]: this is a test 111
[root@server2 ~]#

这里选项是大写的字母S,-S可以换成–since。

文章来源:https://blog.csdn.net/lduan_001/article/details/135500322
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。