认识与分析日志文件

了解日志文件是很重要的事情。日志文件可以记录系统在什么时间、哪台主机、哪个服务、出现了什么信息等。可以在系统出现问题的第一时间段从日志中找到解决方案。

1、什么是日志文件

详细而确实地分析以及备份系统的日志文件是一个SA应该要进行的任务之一。

1.1、日志文件的重要性

解决系统方面的错误;

解决网络服务的问题;

过往事件记录簿。

1.2、Linux常见日志文件名

日志文件可以帮助我们了解很多系统重要的事件,包括登录者的信息部分,因此日志文件的权限通常是设置为仅有root能够读取而已。

一般而言,有以下这些:

/var/log/boot.log:开机的时候系统核心去侦测与启动,接下来开始各种核心支援的功能启动等;

/var/log/cron:例行性工作crontab;

/var/log/dmesg:记录系统再开机的时候核心侦测过程中所产生的各种信息;

/var/log/lastlog:记录系统上面所有账号最近一次登录系统的相关信息;

/var/log/mailog或/var/log/mail/*:记录邮件信息的往来;

/var/log/messages:这个文件很重要,几乎系统发生的错误信息都会记录在这个文件中;

/var/log/secure:基本上,只要牵涉到需要输入账号密码的软件时,那么当登录时都会被记录到此文件中。

/var/log/httpd/*,/var/log/samba/*:不同的网络服务会使用他们自己的日志文件来记录他们自己产生的各种信息。

1.3、日志文件所需相关服务(daemon)与进程

日志文件是怎么产生的呢?基本上有两种方式,一种由软件开发商自定义写入的日志文件与相关格式,例如www软件Apache就是这样处理的;另一种则是由Linux distribution提供的日志文件管理服务来统一管理,你只要将信息丢给这个服务后,它就会自己分门别类地将各种信息放置到相关的日志文件去!Centos提供rsyslog.service这个服务来管理。

rsyslog.service

不过要注意,如果任凭日志文件持续记录的话,那么日志容量将无限增大。日志文件太大可能会导致读写效率不佳(从磁盘读入内存,越大的文件消耗内存越多),所以需要对日志文件备份和更新。我们可以通过logrotate(日志轮替)命令来自动化处理日志文件容量与更新。

logrotate就是将旧的日志文件更改名称,然后新建一个空的日志文件。如此一来,新的文件将重新开始记录,然后将旧的日志保留一阵子,那就可以达到日志的轮转。

针对日志文件所需的功能,我们需要的服务于进程有:

systemd-journald.service:最主要的信息收受者,由systemd提供;

rsystem.service:主要登录系统于网络等服务的信息;

logrotate:主要在进行日志的轮替功能

Centos7.x使用systemd提供的journalctl日志管理

基本上,系统由systemd所管理,那所有经由systemd启动的服务()如果在启动或结束的过程中发生了一些问题或是正常的信息),就会将该信息由systemd-journald.service以二进制的方式记录下来,之后再将信息发个rsyslog.service作进一步的记载。

systemd-journald.service的记录主要都放置与内存中,因此在存取方面效能比较好。我们也能透过journalctl以及systemctl status unit.service 来查看各个不同服务的日志。

1.4、日志文件的一般格式

一般来说,日志文件有以下重要数据:

事件发生日期与时间;

发生此事件的主机名;

启动此事件的服务名称或函数名称;

该信息的实际数据内容。

/var/log/secure


2、rsyslog.service:记录日志的服务

rsyslog.service

2.1、rsyslog.service的配置文件:/etc/rsyslog.conf

rsyslogd针对各种服务与信息记录在某些文件的配置文件就是/etc/rsyslog.conf,这个文件规定了,什么服务的什么等级信息以及需要被记录在哪里(设备或文件)这三个东西。

rsyslog.conf

服务名称

Linux核心的syslog函数自行制定的服务名称,软件开发商可以透过呼叫上述的服务名称来记录他们的软件。Linux核心的syslog认识的服务类型主要有以下这些:

syslog所制定的服务名称与软件呼叫方式

信息等级:

同一服务产生的信息也是有差别的。信息到底有多少种严重的等级呢?基本上,Linux核心的syslog将信息分为七个主要等级:

日志信息等级


基本上,在0(emerg)到6(info)等级间,越高代表越没事,越靠近0则代表 事情危险了。除了0到6之外还有两个比较特殊的等级,那就是debug与none。

特别留意一下在信息等级前还有个[=!]的连接符号:

.:代表比后面还要高的等级(含该等级)都要被记录下来。如mail.info表示只要是mail的信息并且等级高于info就被记录下来;

.=:代表所需要的等级就是后面接的等级而已,其他的不要;

.!:低于该等级的信息才会被记录。

一般来说,比较常用的是“.”这个连接符号。

服务、daemon与函数名称

区分下syslog、rsyslogd、rsyslog.service

rsyslog.conf语法练习

如将mail的相关资料写入/var/log/maillog当中,那么在/etc/syslog.conf的如何设计?

mail.info /var/log/maillog

#任何等级大于info的信息都会被写入到后面界的文件当中。

Centos7中预设的rsyslog.conf内容

/etc/rsyslog.conf文件

#kern.*:只要是内核产生的信息,全部送到console(终端机)去;

*.info;mail.none;authpriv.none;cron.none:由于mail,news,cron等类型生成的信息较多,且已经写入下面的数个文件中,因此在/var/log/messages 里面就不记录这些选项。除此之外的其他信息的记录到/var/log/messages中;

authpriv.*:认证方面的信息均写入/var/log/secure;

mail:邮件方面信息则均写入/var/log/maillog;

cron:例行性工作调度均写入/var/log/cron文件;

*.emerg:当产生严重等级错误时,将该等级的信息以wall的方式广播给所有在系统登录的账号,要这么做的原因是希望在线的使用者能赶快通知管理员处理可怕的错误;

uucp,news.crit:新闻组方面的信息;

local7.*:将本机开机时应该显示到屏幕的信息写入到/var/log/boot.log中。

自行增加日志文件的功能

2.2、日志文件的安全性设置

如果一个很厉害的黑客,入侵了别人的电脑,干了坏事又不想留下证据,这就需要把日志文件清除干净。如果你发现你主机下的log文件不见了,那就需要注意啦。

使用chattr +a这个属性让我们的日志文件只能被增加,不能被删除和写入。只有chattr -a 后才能删除或移动改文件。使用此命令要注意哈,很容易由于自己忘记导致系统的重要信息无法记录。

chattr

2.3、日志文件服务器的设置

将其他主机的日志文件放到日志文件服务器上。

server端假设
client端


3、日志文件的轮替(logrotate)

rsyslog利用的是daemon的方式来启动,当有需求的时候立刻就会被执行,但是logrotate却是在规定时间到了之后才进行日志文件的轮替,所以logrotate是挂在cron下面的。

3.1、logrotate的配置文件

/etc/logrotate.conf    #主要参数 文件

/etc/logrotate.d/    #这个文件类似于nginx中的include的文件

logrotate的主要功能就是将旧的日志文件移动成旧文件,并且重新新建一个新的空的文件来记录,执行结果如下所示:

logrotate

如上图所示,当第一次执行完rotate之后,原本的message变成message.1,第二次执行后,message.1会变成message.2,继续执行下去,但只保留三个message。

/etc/logrotate

重要的 logrotate 选项:

compress            --> 压缩日志文件的所有非当前版本;

nocompress  -->不希望对日志文件进行压缩;

daily,weekly,monthly --> 按指定计划轮换日志文件,每天每周每月;

delaycompress        --> 压缩所有版本,除了当前和下一个最近的;

endscript            --> 标记 prerotate 或 postrotate 脚本的结束;

errors "emailid"    --> 给指定邮箱发送错误通知;

missingok            --> 如果日志文件丢失,不要显示错误;

notifempty          --> 如果日志文件为空,则不轮换日志文件

olddir "dir"        --> 指定日志文件的旧版本放在 “di” 中

postrotate          --> 引入一个在日志被轮换后执行的脚本

prerotate            --> 引入一个在日志被轮换前执行的脚本

rotate 'n'          --> 在轮换方案中保存日志的 n 个版本

sharedscripts        --> 对于整个日志组只运行一次脚本

size='logsize'      --> 在日志大小大于 logsize(例如 100K,4M)时轮换

create 644  nginx adm,以指定的权限创建全新的日志文件,同事logrotate也会重命名原始日志文件;


接下来我们在/etc/logrotate.d/syslog轮替syslog这个文件

/etc/logrotate.d/syslog

在上面的例子中我们来谈一下logrotate的写法:

文件名:如/var/log/cron;

参数:进行轮替的参数用{ }括起来;

执行脚本:可调用外部命令来执行。prerotate,在启动logrotate之前进行的命令;postrotate,在做完logrotate之后启动的命令。这两者在对于已加上特殊属性的文件处理上面是相当重要的执行程序。

关于cron.daily什么时候运行:

/etc/anacrontab

所以,在凌晨3点到10点之间的时间(重新启动后,机器上线5分钟^^)后,运行/etc/cron.daily。如果没有重新启动,则该作业应在3:05 AM++以上运行。

** As definedbySTART_HOURS_RANGE

^^ As definedbyFIELD_TWO (i.e. the5after the1inthe cron.daily line)

++ plus a random time between0and45minutesasdefinedbyRANDOM_DELAY


anacron是一个普通程序,还需要cron去调度。

/etc/cron.d/0hourly    #cron调度

/etc/cron.d/0hourly

/etc/cron.hourly/0anacron    #出发执行anacron

/etc/cron.hourly/0anacron

/etc/anacrontab    #执行/etc/cron.daily目录下任务

/etc/anacrontab

/etc/cron.daily/logrotate    #logrotate任务最终被触发

/etc/cron.daily/logrotate

anacron  -n    #可以实现忽略配置文件中延迟执行的时间并包含-s选项。

4、system-journald.service简介

在有了systemd之后,由于是内存唤醒的,它可以主动呼叫system-journald来协助记载登录信息,因此在开机过程中所有信息,包括启动服务失败等情况等等,都直接记录到systemd-journald里面去了。

systemd-journald用来管理与查询这次开机后的登录信息,而rsyslogd可以用来记录以前和现在的所有资料到磁盘文件,方便未来进行查询。

systemd-journald所记录的信息是在内存中,但系统利用文件的形态将它记录到/run/log下。/run在CentOS7中其实就是内存中的资料。

4.1、使用journalctl观察登录信息

systemd-journald.service的资料如何查阅?很简单,通过journalctl即可。

journalctl命令

4.2、logger指令的应用

让你的资料信息存储到登录文件中,试试logger这个命令。

logger

4.3、保存journal的方式

再次强调,systemd-journald.service的信息是不会放到下一次开机的,所以重新开机过后,那之前的信息统统没有。我们大概都有启动rsyslogd这个服务来进行后续的登录文件存放,不过如果你比较喜欢journalctl的存取方式,那么也可以将其保存下来。

systemd-journald.service的配置文件/etc/systemd/journald.conf,如果你想要保存journalctl的信息,那么先得建立一个/var/log/journal目录,并且修改一下该目录的权限,那么以后重新启动journald之后,日志文件就会主动复制一份到/var/log/journal目录下。

需要注意,整个日志容量会持续增大,所以最好观察系统可用容量。建议放置到/run/log的内存中,以加快存取速度。

5、分析日志文件

日志的分析是很重要的!你可以自行vim或者是journalctl进入日志去查看相关信息。Centos提供了logwatch这个日志分析程式。

yum install logwatch.noarch -y


logwatch

5.2、自定义日志分析脚本

wget http://linux.vbird.org//linux_basic/0570syslog//logfile_centos7.tar.gz

#鸟哥写的


重点回顾:

日志文件可以记录一个事件的何时、何地、何人、何事等信息,故系统有问题是务必查询日志文件;

系统的日志预设都集中在/var/log目录内,其中又以messages记录的信息最多;

系统日志文件的主要服务程序为:systemd-journald.service,rsyslog.service,rsyslogd;

rsyslogd的配置文件在/etc/rsyslog.conf,语法为"服务,等级,装置";等级从不严重到严重依次有info,notice,warning,error,critical,alert,emergency等;

rsyslogd本身有提供日志文件服务器的功能,修改/etc/rsyslog.conf内容即可;

logrotate程序利用crontab来进行日志文件的轮替功能;

logrotate的配置文件为/etc/logrotate.conf,而额外的设置则可写入/etc/logrotate.d/*内;

CentOS7由于内建systemd-journald.service的功能,可以使用journalctl直接从内存中读取日志,查询效果较佳;

logwatch为CentOS7预设提供的一个日志分析软件。

推荐阅读更多精彩内容