自学内容网 自学内容网

Linux日志管理

学习的日志管理介绍

学习日志管理的目的

在我们的生产管理时,我们会遇到系统中的某些问题,这时我们可以通过查看日志来找出问题的所在

作为服务器的管理者,我们必须知道服务器的日志放在哪里?由谁来管服务器的日志?怎么管理日志?

日志的作用

我们可以通过对日志的变化分析来观察用户的行为

学习日志的两个任务

任务一:rsyslogd系统日志管理

日志是由什么程序产生的?rysylogd程序对日志的管理行为是怎么样进行的?

任务二:logrotate日志轮转

logrotate日志轮转类似与我们的行车记录仪;将大量的日志进行分割管理,删除旧日志

谁产生的日志?

日志是由处理日志的进程产生的日志;该进程一般有两种情况

第一种情况被rsyslogd统一管理的日志

实时上当系统中每个程序在运行过程中都会产生日志,只要是系统自带的程序产生的日志都会被reyslogd统一管理

rsyslogd:系统专职日志程序,顾名思义,是系统程序默认进行日志生产的程序

r:receive接收;sys:system系统;log:日志;d:daemon守护进程

与系统操作有关的信息,如登录信息,程序启动,关闭信息或是错误信息都会被记录下来形成一个日志,而rsyslogd程序就是定义这些日志的存放位置

第二种情况由各类程序产生的日志

当我们通过安装包或是网络资源来下载系统外部的应用程序时,如httpd、nginx或是mysql等

我们可以理解为这些程序比较有个性化,它们都会以自己的方式来记录日志

对于这些个性化日志的学习,还是要等我们逐个学习这些程序时在深入学习

常见的日志文件

在我们Linux服务器中,有关于进程文件、应用程序文件、登录、安全审计等大部分日志都会存放在"/var/log"这个目录下

image-20240922130137797

其中"/var/log/messages"是我们的主日志文件,即大部分系统进程的信息都是存放在该日志下的

因为系统是实时运行的,所以日志内的信息也是实时变化的,那么有没有一种方法能够使我们能够观察到日志最新的变化信息呢?

我们可以使用"tail"和搭配"-f"来查看,tail命令是默认查看末尾的第十行,而"-f"选项是是查看的内容在终端上锁定

"tail -f"的命令可以使得我们在查看内容中,直接将前十行的内容排除掉,直接观察新变化的内容以达到观察日志的变化,确定用户的行为

[root@localhost ~]# tail -f /var/log/messages

如下,就是我们在另一个终端上切换用户时所发生的变化的信息被记录在日志"/var/log/messages"中

image-20240922131205645

除了"/var/log/messages",还有一些其他的不同含义的日志文件

“/var/log/secure”,与安全有关的日志文件,例如系统的登录

[root@localhost ~]# tail -f /var/log/secure

如下图的最后一条记录,详细信息中表示:session(会话)opend(被打开)for user root by wjy(root的会话被wjy打开)

换句话说就是有一个wjy的用户切换成了root用户

image-20240922132819689

“/var/log/yum.log"在centos stream 8以前的版本才有,其记录的是使用yum安装的具体情况,由于非常的小,就在新的版本中合并到了”/var/log/messages"中;我们还可以使用另一条命令"yum history info"也能起到查看"/var/log/yum.log"的效果

[root@localhost ~]#yum history 

其原理是调用系统的日志当中的yum管理日志

image-20240922132630627

"/var/log/maillog"收集邮件的日志,但在现在的实际生产中已经变得不适用

“/var/log/cron"任务计划日志。用于了解任务计划的状态,但我们每使用一次crontab命令时,”/var/log/cron"就会发生一次变化

[root@localhost ~]# tail -f /var/log/cron 

image-20240922133849825

/var/log/audit/audit.log:系统审计日志;/var/log/mysqld.log:MySQL日志;/var/log/xferlog:与访问FTP服务器有关;/var/log/wtmp:当前登录用户

/var/log/btmp:最近登录用户;/var/log/lastlog:所有用户的登录情况

日志内容的简述

但我们使用查看文件命令去查看一个日志文件,如"/var/log/messages",其中的每一段参数都有其意义

第一段:Sep 22 13:09:35 :表示日志记录的时间

第二段:localhost:表示主机名localhost为本机

第三段:su[4602]::为程序名,还包括了程序的进程

第四段:(to wjy) wjy on pts/0:表示对变化的详细记录

rsyslogd管理配置

什么是rsyslogd?即处理日志的程序。怎么样处理?通过配置"/var/log"下日志存在的规则

在进行rsyslogd配置之前我们要保证rsyslogd程序是正常运行的,因为系统是自动安装且启动的,所以我们可以直接"systemctl"去查看rsyslogd的状态

[root@localhost ~]# systemctl status rsyslog.service

image-20240922134627210

那么rsyslogd是通过什么来控制日志的存放位置,或是说日志的行为呢?

我们可以通过"rpm -qc rsyslog"来查看rsyslogd所产生的文件

[root@localhost ~]# rpm -qc rsyslog

image-20240922134931785

如上图,可以看到rsyslogd一共产生了三个文件,/etc/logrotate.d/rsyslog;/etc/rsyslog.conf;/etc/sysconfig/rsyslog

其中/etc/logrotate.d/rsyslog和/etc/sysconfig/rsyslog分别为子配置文件和日志轮状文件,我们做了解即可

我们真正要学习的是/etc/rsyslog.conf;该文件是rsyslogd文件的主配置文件,其作用是告诉rsyslogd进程什么日志应该存放在哪里

我们通过vim来查看/etc/rsyslog.conf的内容;

[root@localhost ~]#vim /etc/rsyslog.conf

rsyslogd的RULES

在"/etc/rsyslog.conf"文件中,是有一套RULES规则定义着生成日志,以及存储日志等的策略

RULES由三部分组成,分别是设备(FACILITY)、级别(LEVEL)和存放位置,我们拿"/etc/rsyslog.conf"中的其中一条配置来解释,如下

cron.*                                                  /var/log/cron

cron表示规则中的设备;".“表示分隔符;”*“表示级别,其中”*"就表示全部级别;/var/log/cron:表示存放位置

可能还是有一点对RULES中的FACILITY(设备)和LEVEL(级别)不理解,没事我们下面来详细的解释以下

FACILITY设备

为什么要有FACILITY设备的概念?系统的运行是有很多个部分的,也就是会产生很多的日志信息

如果将一个部分的日志信息放在一个文档中,那么将会产生很多的日志信息,那么这是一件非常耗费资源的事情,且不易于管理

系统的开发者就想到了,将同一类的程序的日志信息整理到同一个文档内,这样就方便我们的管理

而设备的概念就是区分出我们的程序是属于哪一类的,如果加上了设备这个概念,那么可以说是区分程序是哪个设备的

综上所述,设备的概念就是将不同程序进行分类从而产生不同类的设备

使用"man 3 syslog"来查看系统程序的配置的帮助文档,我们在"Values for facility"处即可看见所有设备的类型和对设备类型的解释

LOG_SYSLOG:syslogd自身产生的日志

LOG_AUTHPRIV:安全认证;如切换用户

LOG_CRON:调度程序(cron and at)

LOG_MAIL:邮件系统mail subsystem

LOG_USER (default)用户相关

LOG_DAEMON:后台进程

LOG_FTP:文件服务器ftp daemon

LOG_KERN:内核设备kernel messages

LOG_LPR:打印机设备(printer subsystem)

LOG_LOCAL0 through LOG_LOCAL7:用户自定义设备

LEVEL级别

当进程产生的日志被分完类别之后,我们就需要对其产生的日志信息进行进一步的区分

下至最低级的INFO如平时敲入命令的简单打印到终端上,上至使用删库跑路时使系统奔溃的EMERG紧急级别(严重点就删库跑路,轻松点就配置文件丢失)

同样的使用"man 3 syslog"在"Values for level"信息中也有LEVEL级别的解释,其级别从下到上,级别从低到高,记录的信息越来越少

LOG_EMERG :紧急,致命,服务无法继续运行,如配置文件丢失

LOG_ALERT :报警,需要立即处理,如磁盘空使用95%

LOG_CRIT :致命行为

LOG_ERR :错误行为

LOG_WARNING :警告信息

LOG_NOTICE 普通,重要的标准信息

LOG_INFO :标准信息

LOG_DEBUG :调试信息,排错所需,一般不建议使用

文件位置

文件位置顾名思义,就是日志信息被记录后总该有一个去向吧,这个去向就是文件位置;换句话说就是日志信息都会被存储到文件位置当中

普通的文件位置都是我们平常容易理解的系统下文件路径;但还有非文件路径的,如下

*.emerg                                                 :omusrmsg:*

很明显,该配置是针对所有的设备,但级别是emerg紧急,也就是系统快要奔溃的时候所产生的日志信息;而这个文件位置却是我们少见的一种

":omusrmsg:*"其代表是的当前登录的终端窗口,也就是我们正在敲命令的地方

综上所述,那么这一条配置的意思就是,当系统快奔溃的时候或是某个程序配置文件丢失时,该日志信息会直接展现到我们的眼前

rsyslogd配置文件中主日志文件按

使用"vim /etc/rsyslog.conf"时我们可以看到以下的配置信息也与其他的配置有所不同;如下

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

要理解该配置信息,我们就先要知道其中的";“符号是什么意思,其表示并列,也就是”;“前后是同时生效的,而”."符号又表示为将设备和级别分割开来

所以,综上所述,我们就可以大概猜测出该配置信息的意思:所有的设备的info级别信息存放到"/var/log/messages"下

而后我们又遇到一个知识盲区这里面的none在级别中表示的是什么意思?none则代表该设备类型的日志信息不会存放在该配置信息中的文件位置下,而是独立存放在其他的文件位置下

综上所述,该配置信息就表示为:①所有设别类型的info(标准信息)存放在"/var/log/messages"下;②mail的日志信息不会存放在"/var/log/messages"下,而是单独存放,其中authpriv和cron同理

rsyslogd工作图示

更改rsyslogd配置文件以定义一条属于自己的规则实验

在这个实验中我们以SSH作为实验案例,SSH远程登陆程序,说起登录,那么它肯定是属于安全认证类的设备(即AUTH),这一点是由系统的开发者自定义的

我们这次实验的目的就是更改SSH的设备类型,接着定义一条属于自己的rsyslogd程序规则,最后观察到由于我们的规则中的文件目录所产生的日志信息

1、修改SSH的设备类型为LOCAL5

要想做到这一点,我们就需要对SSH的配置文件进行修改,SSH的配置文件为"/etc/ssh/sshd_conf"

使用"vim /etc/ssh/sshd_conf",我们会看到"#SyslogFacility AUTH"这一条注释,其含义就是定义了SSH为AUTH的设备类型

我们可以在下面添加或修改为"SyslogFacility LOCAL5";经过我们的添加或修改,SSH现在就是属于LOCAL5类型的了

2、修改rsyslogd程序规则,将LOCAL5的日志信息存放在/var/log/server123.log下

那么接下来,SSH的日志信息会发送到rsyslog中,而此时rsyslogd的是不知道其LOCAL5类型的设备产生的日志信息该放到哪里去

所以我们还要进入rsyslog的配置信息中,定义LOCAL5的配置信息(包括其级别和文件位置)

进入"/etc/rsyslog.conf",添加"LOCAL5.* /var/log/server123.log"

3、重启rsyslogd和SSH程序

因为我们修改了其配置文件,所以我们需要重启使得最新的配置激活

依旧是使用"systemctl restart rsyslog.service sshd",

4、制造Xsheel事件,让后观察日志文件

image-20240922154338701

命令总结

vim /etc/ssh/sshd_conf//添加或修改以下内容
SyslogFacility LOCAL5
vim /etc/rsyslog.conf//添加以下内容
LOCAL5.*/var/log/server123.log
systemctl restart rsyslog.service sshd
cat /var/log/server123.log

logrotate日志轮转

logrotate日志轮转简介

logrotate主要解决了日志大量占用空间的问题,其方式是将日志分割为新和旧,将老旧无用的日志清理掉

logrotate会按照系统任务计划中设定的时间来自动清理,那为什么一切都已经设定好了,却又需要我们学习logrotate呢?

除了在日志管理中,这部分的内容是我们需要了解的。我们还可以修改其规则策略来影响轮转的效果

日志轮转可以比喻为我们的行车记录仪,在定期的时间会删除之前的内容,这样做节省了空间同时也方便我们管理

日志轮转是分为两个维度的,①按照时间来分,②按照大小来分(如只保留100m的文件)

日志轮转的原理

logrotate日志轮转会根据一个配置文件中的规则来查询,查到了哪个日志不符合我们的规则,就将其分割和清理。而这个配置文件就是"/etc/logratate.conf"

/etc/logrotate.conf就相当与logrotate的主配置文件,除此之外,logrotate还有一个子配置文件目录"/etc/logrotate.f/*"

/etc/logrotate.f/*该目录下的的所有文件都是与logrotate日志轮转有关的规则

而/etc/logrotate.conf和/etc/logrotate.f/*两者的区别在于/etc/logrotate.f/*下的文件是可以自定义配置的

所以我们在我们进行日志轮转的任务计划自定义时,可以不去修改/etc/logrotate下的配置文件,避免影响到程序的正常运行

因为有些从外部安装的程序有着一套自己的日志体系,所以/etc/logrotate.f/*内的文件会随着我们安装的程序增加而增加

使用cat命令可以一次性查看"/etc/logrotate.f/*"下的所有文件

[root@localhost ~]# cat /etc/logrotate.d/*

image-20240922202511253

日志轮状是如何区分老/新日志

日志轮转会定期回像使用mv命令那样对老文件进行备份

将以前的文件备份成一个新名字的文件,那么经过备份后,系统就找不到老日志了

此时系统会创建一个与老文件名字相同的日志,这样一来,就可以区分出老日志和新日志了

即新日志的名字是不会变的,而老日志的名字是一直在变化的

logrotate配置文件内规则解析

我们使用vim去查看logrotate主配置文件/etc/logrotate.conf可以看到如下内容

vim /etc/logrotate.conf

image-20240922191936181

如上图;weekly:表示轮转周期为一周,即一个星期将日志切割一次,则上星期的日志就成为了老日志了,此外,weekly还可以换成daily,yearly,mouthly以此来调整切割文件的时段为一周还是一天等

rotate 4:表示将日志的最大保留数为4,因为日志轮转的方式是将日志切割为开来,那么随着时间的流逝,日志的数量也会越来越多,这就违背了我们日志轮转的初心了,所以需要rotate的存在,来约束我们日志存在的最大数量,当然默认是先删除掉老的日志

create:表示在轮转时会创建新文件;create的意义就是在老日志备份后创建一个与老日志名字相同的日志

dateext:在老日志备份后的文件名就是在老日志名字的文件基础上加上备份时间的后缀,而dateext就提供了这种功能

missingok:表示日志文件若是丢失后就不会在做处理

compress:表示将轮转后以添加时间后缀改名的文件进行压缩

include /etc/logrotate.d:表示系统在启动时会去查看/etc/logrotate.d目录下的文件,因为还有一些我们自定义的规则在/etc/logrotate.d目录下

日志轮转的实验

在该实验中我们要系统主日志"/var/log/messages"在我们自定义的规则中进行logrotate日志轮转,最后观察"/var/log"内带有messages文件的状态

1、我们先要注释掉原本的日志轮转信息,在"/etc/logrotate/rsyslog"中,其内容表示系统会对哪几个日志进行轮转

因为我们这次实验的目标是系统主日志,所以只需要将"/etc/log/messages"删掉即可

2、接着我们就可以开始在logrotate子配置文件目录"/etc/logrotate.d"下自定义我们的规则了,使用vim添加以下内容

/var/log/messages //该路径表示对该日志进行轮转,日志文件名字是自定义的,而由{}包起来的内容表示日志轮转的命令
{
missingok //丢失不执行
# notifempty //空文件不论转
# maxsize 30k //达到30k轮转, daily or size
# yearly //或者一年一轮转
daily //缩小周期到1天
rotate 3 //轮转保留3次
create 0660 root root
}

3、测试修改时间,我们通过手动修改时间,来达到手动触发轮转的目的(将时间推到下一天)

date 04011000//04011000:二个为一组,分别表示月日时分,所以这里表示04月01号10时00分

4、将时间推向未来

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
-s选项表示按照一个时间戳,记录整个系统中被轮转后的文件,但是该命令时系统自动会执行的,我们不需要记忆

5、我们通过不断的修改时间(下一天)来验证是否自定义规则成功,即不断重复3和4的操作

image-20240922203607186

进而说明了rotate 3的轮转3次的意思是保留老日志的数量最多为3个

image-20240922203730281

关于logrotate轮转时间的文件

/var/lib/logrotate/logrotate.status该文件下记录着服务器需要对哪些日志进行日志轮转,并且最后一次轮转的时间

cat /var/lib/logrotate/logrotate.status

image-20240922202212505


原文地址:https://blog.csdn.net/2401_83604604/article/details/142443354

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!