Linux日志

2023-12-13 13:01:35

本章主要介绍Linux中的日志管理

????????了解rsyslog是如何管理日志的

????????查看日志的方法

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

????????在RHEL8/CentOS8中,日志是由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级别最低。

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

????????为了更好地理解,先看一个例子。假设rsyslog.conf中已经定义了4条日志规则,如图所示。

?

?????????这里定义了不同类别的日志记录的最低标准,以及记录到哪个文件中。例如,第4条规则 local5类别的日志,如果级别大于等于info,会记录到 file4.log中,如图所示。

?????????现在有一个A应用,在其代码中指定它所使用的日志类别是local5,所以在A应用的日志生成时,会使用第4条规则。因为第4条规则指定的是如何记录 local5级别的日志。

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

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这三个类别,即这三个类别的日志不匹配这条规则,因为这三个类别后面写的级别是non。

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 中。

 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@redhat8 ~]# systemctl restart rsyslog.service 

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

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

????????这个命令的意思是,模拟产生一个类别为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@redhat8 ~]# ls /ar/log/xx.log
ls: 无法访问'/ar/log/xx.log': 没有那个文件或目录

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

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

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

[root@redhat8 ~]# grep 2222 /var/log/messages 
Dec 13 11:03:58 redhat8 root[2417]: 2222
[root@redhat8 ~]# cat /var/log/xx.log
Dec 13 11:03:58 redhat8 root[2417]: 2222

????????可以看到,这个日志被记录到两个文件中了。

????????现在重新模拟—个local6级别为err 的日志,日志内容为3333,命令如下。

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

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

[root@redhat8 ~]# grep 3333 /var/log/messages 
Dec 13 11:05:04 redhat8 root[2432]: 3333
[root@redhat8 ~]# cat /var/log/xx.log
Dec 13 11:03:58 redhat8 root[2417]: 2222
Dec 13 11:05:04 redhat8 root[2432]: 3333

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@redhat8 ~]# journalctl 

????????直接输人“journalctl”,会显示系统所有的日志。此时显示了一页的日志,按【Esc】键可以退出来,按【Enter】键可以一行一行地往下显示,按空格键可以一页一页地往下显示。

????????如果想查看最新的日志,命令如下。

[root@redhat8 ~]# journalctl -f

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

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

[root@redhat8 ~]# journalctl -p emerg
-- Logs begin at Wed 2023-12-13 10:52:29 CST, end at Wed 2023-12-13 11:10:52 CST. --
-- No entries --

????????没有任何输出,说明系统中暂时没有emerg级别的日志。我们先模拟一个类别为local6、级别为emerg的日志,命令如下。

[root@redhat8 ~]# logger -p local6.emerg "xxxx"
[root@redhat8 ~]# 
Broadcast message from systemd-journald@redhat8 (Wed 2023-12-13 11:19:32 CST):

root[2564]: xxxx


Message from syslogd@redhat8 at Dec 13 11:19:32 ...
 root[2564]:xxxx

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

[root@redhat8 ~]# journalctl -p emerg
-- Logs begin at Wed 2023-12-13 10:52:29 CST, end at Wed 2023-12-13 11:19:32 CST. --
12月 13 11:19:32 redhat8 root[2564]: xxxx

????????可以看到,有一条emerg 级别的日志了。

????????journalctl还可以查看某个时间段的日志,格式如下。

journalctl ‐‐since "时间1" ‐‐until "时间2"

????????这里since指的是起始时间,until指的是终止时间,整体的意思是查看的是时间1和时间2之间的日志。例如,要查看自2023-11-12?11:00:00到2023-11-1311:10:00且级别要大于等于err 的日志,命令如下。

[root@redhat8 ~]# journalctl -p err --since "2023-11-12 11:00:00" --until "2023-11-13 11:10:00"
-- Logs begin at Wed 2023-12-13 10:52:29 CST, end at Wed 2023-12-13 11:25:01 CST. --

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

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