Linux日志分析

做~自己de王妃 提交于 2020-02-28 03:48:30

1. Linux日志文件的类型

2. 系统服务日志

2.1 rsyslogd的简介

为了方便管理日志的记录,我们将会使用的rsyslogd服务。rsyslogd是一个提供日志记录的系统组件,它支持internet和UNIX域套接字,因此进而能够支持本地和远程的日志记录。rsyslogd能够为许多现代程序提供日志记录,
每条记录都包含一个时间戳字段、一个主机名字段以及一个程序名字段。 rsyslog可通过模板的方式来定义输出格式,关于rsyslog的配置我们将在下一节中再详细讨论。 此外,它还支持精确的时间戳并能够直接写入数据库, 如果使用了数据库选项,则可以使用phpLogCon之类的工具来查看日志数据。

2.2 rsyslog的配置和使用

rsyslog可以在通过查看和编辑/etc/rsyslog.conf来更改其配置。rsyslog.conf文件是rsyslogd的主要配置文件,所谓的配置其实就是日志记录的规则。我们首先来看一下rsyslog.conf中包含什么样的信息:

authpriv.*               /var/log/secure
mail.*                   -/var/log/maillog
cron.*                   /var/log/cron
*.emerg                  :omusrmsg:*
uncp,news.crit           /var/log/spooler
local7.*                 /var/log/boot.log

乍一看并不知道这里面的信息是什么含义,别着急,接下来让我们详细地分析一下这些信息。这个文件中的每一行可以单独表示一条完整的信息,例如

cron.*                   /var/log/cron

就是一条完整的信息,它表示将所有cron服务的所有信息等级的信息都存在/var/log/cron日志里。那么我们就以这条信息为例来分析一下它的结构,这条信息可以分为三部分,分别是服务名称、信息等级和日志路径。

  • 服务名称:

在上面的这条信息中,服务名称是cron,即Linux的cron服务,由前面章节的学习我们知道cron是一个用于例行工作调度的服务。一般常用的配置服务名称有以下这些:auth、authpriv、cron、daemon、kern、lpr、mail、mark、news、security(与auth一样)、syslog、user、uucp以及local0到local7。其中值得注意的是security官方已经建不应该再使用了,而mark不应该在应用程序里面使用,local0到local7用于记录机器本身的一些信息。

rsyslog的服务名称是怎样与应用程序关联起来的呢?如下图所示,应用程序可以调用rsyslog中对应的服务名称,例如login和su调用auth,所以与auth关联,sendmail、postfix和dovecot调用mail所以与 mail关联,而contrab则与cron关联。

图1 rsyslog服务名称与应用程序的关联关系

其它更详细的内容,感兴趣的同学可以参考官方文档: http://man7.org/linux/man-pages/man5/rsyslog.conf.5.html

  • 信息等级:

服务所产生的信息可以分为很多个不同的等级,这些等级反映了信息的紧急程度。具体而言,紧急程度从一般的信息到非常严重的信息分成了9个不同的等级,分别为:debug、info、notice、warning、warn(与warning一样)、err、error(与err一样)、crit、alert、emerg、panic(与emerg一样),其中error、warn和panic已经被丢弃,不应该再使用了。此外,还可以使用”*“来表示任意的信息等级,比如例子当中的cron.*就表示对于cron服务的所有信息等级的信息都记录到日志当中。

  • 日志路径:

日志路径指明了日志信息存储的位置,例如上述例子中日志的路径为/var/log/cron,因此我们可以通过以下命令查看一下cron相关的日志:

[root@localhost ~]# cat /var/log/cron

结果如下:

Feb 16 04:08:02 localhost run-parts(/etc/cron.daily)[3937] finished logrotate
Feb 16 04:08:02 localhost run-parts(/etc/cron.daily)[3925] starting man-db.cron
Feb 16 04:08:03 localhost run-parts(/etc/cron.daily)[3948] finished man-db.cron
Feb 16 04:08:03 localhost anacron[3906]: Job 'cron.daily' terminated
Feb 16 04:08:03 localhost anacron[3906]: Normal exit (1 job run)
Feb 16 05:01:01 localhost CROND[3984]: (root) CMD (run-parts /etc/cron.hourly)
Feb 16 05:01:01 localhost run-parts(/etc/cron.hourly)[3984]: starting 0anacron
Feb 16 05:01:01 localhost run-parts(/etc/cron.hourly)[3993]: finished 0anacron
Feb 16 06:01:01 localhost CROND[4009]: (root) CMD (run-parts /etc/cron.hourly)
Feb 16 06:01:01 localhost run-parts(/etc/cron.hourly)[40009]: starting 0anacron
Feb 20 11:21:44 localhost crond[2814]: (CROND) INFO (RANDOM_DELAY will be scaled with factor 7% if used.)
Feb 20 11:21:44 localhost crond[2814]: (CRON) INFO (running with inotify support)

可以看到cron相关的日志的确记录在了/var/log/cron这个文件当中。

另外,日志路径还可以设置为远程地址,比如可以将上述的例子改为:

cron.*   @192.168.0.99

表示将cron服务的所有信息等级的记录,发送到IP地址为192.168.0.99的机器上进行记录,”@”表示通过UDP协议发送,如果想要采用TCP协议,则将”@“改为”@@“。

2.3 日志的安全性设置

2.4 远程日志记录服务

3. 日志的轮替

解决日志如何记录之后,接下来遇到一个问题,那就是磁盘的空间有限,日志文件的大小不能无限制地增长。为了解决这个问题,我们需要对日志文件进行管理,一般的做法是对日志进行轮替,即当日志文件的大小达到一定程度的时候,需要并且重命名日志文件,并且重新创建一个新的文件来存储日志。聪明的你也许已经想到自己写一个日志轮替处理的脚本,并通过cron来进行定时调度。实际上,Linux已经有现成的程序帮助我们做这件事,那就是logrotate。接下来我们看看如何使用logrotate。

3.1 logrotate简介

logrotate用于简化那些会生成大量日志文件的系统的管理, 它允许自动对日志进行轮替、压缩和删除,并且能够通过邮件发送日志文件,每个日志文件都可以以每天、每周、每月等周期进行轮替,同时也可以通过设置使得日志大小达到一定程度时进行处理。

如图2所示为logrotate进行轮替操作的具体过程,当达到了周期或者日志大小达到了限制时,便触发了logrotate的轮替操作,logrotate会将log文件重命名为log.1,此时新记录的日志会重新创建log文件,因此目录下同时存在log和log.1两个文件。更进一步地,再第二次轮替时,logrotate先将log.1重命名为log.2,再将log重命名为log.1,新记录的日志同样会重新创建log文件,因此目录下同时存在log、log.1和log.2三个文件,以此类推。聪明的你可能已经想到,如果这样无限制地生成新的文件,会不会耗尽磁盘空间呢?事实上logrotate的配置中允许我们设置最多保留的日志文件个数,详细的配置内容我们将在下一节中进行讨论。

图2 logrotate对日志文件进行轮替操作

正常情况下,logrotate以cron任务的形式执行,通常周期为每天,一般不会在一天之内对日志进行多次轮替,除非设置了基于日志大小来进行轮替,并且在一天之内达到了日志大小的限制。

3.2 logrotate的配置

接下里让我们来看看如何对lorotate进行配置。logrotate的配置文件为/etc/logrotate.conf,下面我们来看看logroate.conf中包含哪些内容:

weekly
rotate 4
create
compress
dateext

include /etc/logrotate.d

/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

现在让我们逐行来看看这些配置。

  • 第一行的weekly表示以每周作为周期进行日志轮替,此处可以设置的选项有:daily、weekly和monthly;
  • 第二行rotate 4表示最多保留前4次轮替的日志文件,第5次轮替时将会最早的日志文件删除掉,例如将log.4删除,并将log.3重命名为log.4;
  • 第三行create表示在进行轮替后,立即创建新的日志文件;
  • 第四行compress表示轮替时对日志文件进行压缩,通常可用于压缩日志占用的空间;
  • 第五行dateext表示以时间戳作为轮替文件的后缀,比如图2中轮替时log重命名为log.1,当设置了dateext时,log将会重命名为log-20200223,其中20200223为当天的时间戳;
  • 第六行include /etc/logrotate.d表示额外的配置目录,在这个目录下面的文件都作为配置的内容,而目录下的配置通常用于覆盖默认配置,/etc/logrotate.conf便是默认配置,它适用于所有日志;
  • 关于/var/log/wtmp的配置:我们可以看到这里是一个专门针对/var/log/wtmp日志的配置,它的配置被一对大括号所包含,大括号里面的配置将会覆盖上面的配置,例如这里面的monthly将会覆盖默认的weekly。create 0664 root utmp指定了创建新文件时所使用的权限,以及所属帐号和用户组。minsize 1M表示日志文件大小一定要超过1MB后才进行轮替操作。rotate 1覆盖了默认的rotate 4;
  • 关于/var/log/btmp的配置:同样是覆盖默认配置,类似于/var/log/wtmp的配置。

3.3 logrotate的使用

介绍完logroate的配置之后,我们可以通过logrotate命令对其进行启动,其中-v选项用于打印出详细的信息:

[root@localhost ~]# logrotate -v /etc/logrotate.conf

输出如下:

reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file alternatives
reading config file apt
reading config file chrony
reading config file dpkg
reading config file mysql-server
reading config file rsyslog
reading config file ufw
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Creating new state
Creating new state
Creating new state
Creating new state
...
Handling 11 logs

rotating pattern: /var/log/alternatives.log  monthly (12 rotations)
empty log files are not rotated, old logs are removed
switching euid to 0 and egid to 106
considering log /var/log/alternatives.log
  Now: 2020-02-25 21:33
  Last rotated at 2019-09-24 06:25
  log does not need rotating (log is empty)
switching euid to 0 and egid to 0

rotating pattern: /var/log/apt/term.log  monthly (12 rotations)
empty log files are not rotated, old logs are removed
switching euid to 0 and egid to 106
considering log /var/log/apt/term.log
  Now: 2020-02-25 21:33
  Last rotated at 2019-11-02 06:25
  log does not need rotating (log is empty)
switching euid to 0 and egid to 0
...

这里只列出了一些值得关注的内容,省略了一些冗余的信息。观察结果可以清楚地看到logrotate的执行过程,首先是读取配置文件/etc/logrotate.conf,然后是读取logrotate.d目录下的所有配置文件,接着读取logrotate的状态,创建哈希表来记录日志的状态,最后是对每项日志进行轮替的检查。以/var/log/alternatives.log为例,我们可以从上面的结果中可以看到这个日志的轮替周期被配置为monthly,并且还看到上一次执行轮替操作的时间,以及现在是否需要执行轮替操作等。

此外,我们也可以使用-f选项来强制logrotate立刻执行轮替操作:

[root@localhost ~]# logrotate -vf /etc/logrotate.conf

执行结果如下:

...
rotating log /var/log/auth.log, log->rotateCount is 4
dateext suffix '-20200225'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
error: Compressing program wrote following message to stderr when compressing log /var/log/auth.log.1:
switching uid to 0 and gid to 106
renaming /var/log/auth.log.4.gz to /var/log/auth.log.5.gz (rotatecount 4, logstart 1, i 4),
renaming /var/log/auth.log.3.gz to /var/log/auth.log.4.gz (rotatecount 4, logstart 1, i 3),
renaming /var/log/auth.log.2.gz to /var/log/auth.log.3.gz (rotatecount 4, logstart 1, i 2),
renaming /var/log/auth.log.1.gz to /var/log/auth.log.2.gz (rotatecount 4, logstart 1, i 1),
renaming /var/log/auth.log.0.gz to /var/log/auth.log.1.gz (rotatecount 4, logstart 1, i 0),
old log /var/log/auth.log.0.gz does not exist
renaming /var/log/auth.log to /var/log/auth.log.1
creating new /var/log/auth.log mode = 0640 uid = 102 gid = 4
running postrotate script
switching euid to 0 and egid to 0
removing old log /var/log/auth.log.5.gz
switching euid to 0 and egid to 0

rotating pattern: /var/log/wtmp  forced from command line (1 rotations)
empty log files are rotated, old logs are removed
switching euid to 0 and egid to 106
considering log /var/log/wtmp
  Now: 2020-02-25 23:51
  Last rotated at 2020-02-01 06:25
  log needs rotating
rotating log /var/log/wtmp, log->rotateCount is 1
dateext suffix '-20200225'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/wtmp.1 to /var/log/wtmp.2 (rotatecount 1, logstart 1, i 1),
renaming /var/log/wtmp.0 to /var/log/wtmp.1 (rotatecount 1, logstart 1, i 0),
old log /var/log/wtmp.0 does not exist
renaming /var/log/wtmp to /var/log/wtmp.1
creating new /var/log/wtmp mode = 0664 uid = 0 gid = 43
removing old log /var/log/wtmp.2
switching euid to 0 and egid to 0
...

从上面的结果中我们可以看到/var/log/auth.log和/var/log/wtmp的日志轮替信息,对日志进行了压缩、重命名、删除旧文件等一系列操作。

4. 日志分析脚本

4.1 logwatch套件

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!