> CentOS > CentOS教程 >

CentOS日志系统组成详解

日志系统有三部分组成:
一、使用什么工具记录系统产生的日志信息?
      syslog服务脚本管理的两个进程: syslogd、klogd 来记录系统产生的日志信息;
      klogd     进程是专门为内核产生的日志信息服务的。
      syslogd  进程是专门为应用程序服务(除了内核)产生的日志信息服务的;
       只有调用了 logger 接口,应用程序才可以调用 syslogd工具帮助记录日志信息。

二、只要系统服务在运行,就会产生日志信息,我们使用专门的工具把它记录到磁盘上了,为了方便   

        分析日志,日志文件不能太大、很久以前的日志文件我们应该把它删掉。这些工作由谁完成呢?
        使用 logrotate 命令来滚动,syslog记录的日志文件。

三、为了让人们从繁忙的工作中解脱出来。自动化管理:日志文件的滚动、备份、压缩等工作。
        使用两个忠实的劳动者(进程):crond 和 anacron ,完成上述的所有工作。

 wKiom1OZvtnDg8k0AAFOCcMsYjo100.jpg

看看它们各部分的实现过程:
1、syslog
       syslog 只是用来管理 sysogd 和 klogd 的服务脚本。它们的配置文件在 /etc/syslog.conf

 
    [root@node2 logs]# cat /etc/syslog.conf
      
     # Log anything (except mail) of level info or higher.
     # Don't log private authentication messages!
       *.info;mail.none;authpriv.none;cron.none                /var/log/messages
     # 星号(*) 表示通配所有的 priority
     # *.info  表示记录所有priority的info级别的日志信息。注意不紧包括 info 级别的,还包括比 info 级别高的所有日志信息都会被记录下来。如:notice、warn、err、...、panic
     # *.info;mail.none;authpriv.none;cron.none   表示星号(*)通配的所有 priority但不包括 mail、authpriv、cron.
     # 意思是说,mail、authpriv、cron 系统的日志信息不会被记录到 /var/log/messages 中来。
    
     # Log all the mail messages in one place.
       mail.*                                                  -/var/log/maillog
     # 星号(*)  表示通配所有的 priority.
     # mail.*   表示记录系统 mail 产生的所有级别的日志信息。
     # -/var/log/maillog  横线(-)表示系统 mail 产生的日志信息是异步写入磁盘的。意思是先把它存在 page cache 缓冲池中。再根据某种策略把它一次性刷写到磁盘中。
     # mail 是一个很繁忙的系统,产生的日志信息量非常大。如果每次产生的日志信息就立即把它写到磁盘上的话,效率是很低的。磁盘IO速度很慢的。原因,系统默认是启动
     # 两个脏页刷写线程的。可以通过/proc接口查看 [root@node2 ~]# cat /proc/sys/vm/nr_pdflush_threads 。Linux 会根据系统繁忙程度启动更多的线程来为刷写脏页服务的。
     # 当然我们也可以调节该内核参数。但是要根据我们硬件CPU的颗数来调节。
     # Everybody gets emergency messages
       *.emerg                                                 *
     
     # *.emerg  *    表示所有系统的emerg等级的日志信息都发给所有用户。
     # Save boot messages also to boot.log
      local7.*                                                /var/log/boot.log
     # 该项记录的是系统引导过程的所有级别的日志信息。

    配置文件格式:
                 facility.priority         /path
    facility             是用来定义由谁产生的日志信息:那个软件、子系统运行过程中产生的日志信息。
    priority             是用来定义记录什么类型的日志信息。是应用程序产生的所有信息都把它记录到日志

                             文件中呢,还是只记录该应用程序的错误日志信息等等。
    /path/file_name      是用来定义把日志信息写到哪里去。

    查看常见的facility和priority:

 
[root@node2 ~]# man syslog.conf
          # 常见的 facility
          The  facility  is  one of the following keywords: auth, authpriv, cron,
       daemon, kern, lpr, mail, mark, news, security (same as  auth),  syslog,
       user,  uucp and local0 through local7.
          
   # 常见的 priority
          The priority is one of the  following  keywords,  in  ascending  order:
       debug,  info, notice, warning, warn (same as warning), err, error (same
       as err), crit, alert, emerg,  panic  (same  as  emerg).

       syslog 有统一的日志文件格式,方便管理员阅读。
       Linux 系统日志文件的标准格式:
                                 事件发生的时间    哪台主机的日志    产生日志信息的系统    系统发生的事件
       它们各字段之间使用空格隔开。

 
[root@node2 ~]# tail /var/log/cron
Jun 12 10:00:01 node2 crond[5487]: (root) CMD (/usr/lib/sa/sa1 1 1)Jun 12 10:01:01 node2 crond[5490]:(root) CMD (run-parts /etc/cron.hourly)

    说明:
           事件发生的时间:         Jun 12 10:01:01
           哪台主机的日志:         node2
          产生日志信息的系统:     crond[5490]
          系统发生的事件:         CMD (run-parts /etc/cron.hourly)

 
[root@node2 ~]# tail -2 /var/log/messages
Jun 11 22:13:54 node2 syslogd 1.4.1: restart.
Jun 11 22:13:54 node2 kernel: klogd 1.4.1, log source = /proc/kmsg started.

 2、日志文件的滚动:
       所有的日志文件都会随着时间的推移和访问次数的增加而迅速增大,因此必须对日志文件进行定期

      清理以免造成磁盘空间不必要的浪费。同时这也得以后日志分析方便。
      日志滚动处理程序 logrotate,能够自动(当然自动就是把日志滚动做成周期性任务来完成的)完成日志

      的压缩、备份、删除和日志邮寄等工作。
      每个日志文件都可以被设置成每日、每周或每月处理,也能设置当日志文件太大时立即滚动。
       logrotate 的工作原理:把被滚动的日志文件定义logrotate的配置文件(/etc/logrotate.d/fine_name),

      并定义好日志滚动事略。
     日志滚动处理程序读取配置文件,然后就会根据用户定义的滚动策略来分析日志文件,是否对日志

      文件进程滚动。
     logrotate 的配置文件分为两段:主配置文件(/etc/logrotate.conf)和子配置文件定义在/etc/logrotate.d/

     目录中(需要使用include把该目录包含进来 )
    定义一个日志文件的滚动配置文件格式:
              日志文件的全路径 {
            logrotate 指令
       }
    了解一个日志滚动处理程序 logrotate 是怎样对 syslogd 和 kelogd 记录的日志文件进程滚动的?

 
[root@node2 ~]# cat  /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly 定义清理日志的周期.
# 已经把使用命令【logrotate】进行日志滚动的服务定义成了周期性任务计划。
# 但是每天的4点02分会执行一次, 
# [root@node2 ~]ll /etc/cron.daily/logrotate
# -rwxr-xr-x 1 root root 180 Feb 27  2009 /etc/cron.daily/logrotate
# 文件 /etc/cron.daily/logrotate 实际上是运
#行 /usr/sbin/logrotate /etc/logrotate.conf 
# 也就是说,每天的4点02分就使用命令【logrotate】对定义在/etc/logrotate.d 目录下
# 的符合滚动条件的应用程序的日志文件
# 进程滚动。
     weekly
# keep 4 weeks worth of backlogs 保存过去4周的日志文件
     rotate 4
# 滚动日志的同时创建新的空的日志文件
# create new (empty) log files after rotating old ones
     create
# uncomment this if you want your log files compressed 是否使用压缩功能
     #compress
# RPM packages drop log rotation information into this directory 
# 把/etc/logrotate.d目录的文件包含进来。
# 如果主配置文件/etc/logrotate.conf与/etc/logrotate.d目录下的配置文件定义了相
# 同的指令,则覆盖主配置文件中的指令。否则的话使用主配置文件中的指令。
     include /etc/logrotate.d
# no packages own wtmp -- we'll rotate them here 
    /var/log/wtmp {
         monthly
         minsize 1M
         create 0664 root utmp
         rotate 1
    }
 
[root@node2 ~]# cat /etc/logrotate.d/syslog
# 对 /var/log/messages、/var/log/secure、 /var/log/maillog、
#/var/log/spooler、/var/log/boot.log和/var/log/cron日志文件进行日志滚动。 
 /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
    # 调用日志滚动通用函数
    sharedscripts
    # 在日志滚动之后执行,postrotate与endscript之间的命令
    postrotate
       /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
   }

     如果我们写好了一个日志滚动的配置文件,怎样知道日志滚动处理程序根据配置文件对日志文件的

     操作是否成功呢。
     则要使用 logrotate 命令的选项以指定配置文件进程测试了。
    【logrotate】命令格式
     logrotate [选项] <configfile>
      -d:       详细显示指令执行过程,便于排错或了解程序执行的情况。
      -f:       强行启动日志文件的滚动操作。忽视 logrotate 中定义的日志滚动条件。可以用来测试所配置

      的日志滚动是否正确。

      决定使用 logrotate 应用程序来做 httpd 服务器的日志滚动.
   1)、在/etc/logrotate.d/目录下,新建文件 httpd 做为 httpd 服务的日志文件的滚动配置文件。

 
[root@node2 ~]# cat /etc/logrotate.d/httpd
/usr/local/apache2/logs/access.log  /usr/local/apache2/logs/error.log {
   missingok         # 若日志文件丢失则创建一个新的日志文件
   notifempty
   rotate   4
   size  2M          # 当日志文件达到 2M 以后才做日志文件的滚动
   sharedscripts
   postrotate
       /bin/kill -1 `cat /var/run/httpd.pid  2>/dev/null` 2>/dev/null
   endscript
 }

注意:
        要想使用命令【logrotate】的 -f 参数来测试刚配置好的日志滚动配置文件,记得一定要使用指令

         rotate n 来备份几个滚动后日志文件。如果没有使用rotate
         指令的话,【logrotate -f /etc/logrotate.d/configfile】是不会备份滚动后的日志的。

         一执行【logrotate -f /etc/logrotate.d/configfile】就会看到一个现象:被滚动的日志文件被清空了。
         使用 -f 选项,如果我们的配置文件中有错误,也会显示出来的。便于我们修改。
          也可以使用【date】来调整系统时间,来执行/etc/cron.daily/logrotate任务。就可以看到结果了。

 

2)、模拟应用程序logrotate执行的时候,httpd服务器的日志是否滚动

 
   [root@node2 ~]# ll /usr/local/apache2/logs/
   total 53172
   -rw-r--r-- 1 root root 25702370 Jun 11 16:19 access.log
   -rw-r--r-- 1 root root      833 Jun 11 16:18 error.log

使用 logrotate 命令的 -f 选项强制执行日志文件的滚动

 
[root@node2 ~]# logrotate   -f /etc/logrotate.d/httpd

再检查 httpd 服务器的日志是否滚动了?期待或

 
   [root@node2 ~]# ll /usr/local/apache2/logs/
   total 53176
   -rw-r--r-- 1 root root        0 Jun 11 16:27 access.log
   -rw-r--r-- 1 root root 25702370 Jun 11 16:19 access.log.1
   -rw-r--r-- 1 root root        0 Jun 11 16:27 error.log
   -rw-r--r-- 1 root root      833 Jun 11 16:27 error.log.1

说明:
    从结果可以得知:
                 使用命令【logrotate】实现了对 httpd 服务器的日志文件做了日志滚动。

 

3、怎么让日志滚动自动执行呢?
       Linux 系统中有两个守护进程 crond 和 anacron ,用于自动执行系统和用户的周期性任务。
       crond 与 anacron 是完全不同的两个用于定期执行任务的守护进程。
       crond 假定服务器是 7x24 小时运行的,当有一段关机时间就会遗漏这一时间段

       应该执行的 crond 任务。
       anacron 是为了执行因为时间不连续,crond 而遗漏的任务。
      这样,它们两携手起来就不会因为服务器关机或系统时间改变而遗漏计划任务了。
     周期性任务计划又分为:系统的周期性任务计划(定义在/etc/crontab)和用户的周期性任务计划

    (定义在/var/spool/cron/$user)。
    crond 守护进程是如何完成周期性任务计划的执行的呢?
     crond 首先会会读取,系统的周期性任务计划(定义在/etc/crontab)和用户的周期性任务计划

    (定义在/var/spool/cron/$user),crond 守护进程时时监控着,
    是否到了周期性任务计划的执行时间。当任务计划中的时间和日期与系统的当前时间和日期相同

    时,就执行相应的周期性任务计划。crond 任务执行结束后,
   任何输出将作为邮件发送给安排周期性任务的所有者。

 
  [root@node2 ~]# cat /etc/crontab
   SHELL=/bin/bash
   PATH=/sbin:/bin:/usr/sbin:/usr/bin
   MAILTO=root
   HOME=/
   # run-parts
   01 * * * * root run-parts /etc/cron.hourly
   02 4 * * * root run-parts /etc/cron.daily
   22 4 * * 0 root run-parts /etc/cron.weekly
   42 4 1 * * root run-parts /etc/cron.monthly

  说明:
       这是定义系统的周期性任务计划的配置文件。
       02 4 * * * root run-parts /etc/cron.daily  表示:每天4点02分,使用root用户去执行命令(脚本)run-parts /etc/cron.daily 
       其中 /etc/cron.daily 是命令或脚本(run-parts)的参数。
       而 /etc/cron.daily 目录中定义很多要执行的可执行脚本,这些脚本就是要执行的任务。
   
   查看每天的计划任务有哪些?

 
   [root@node2 ~]# tree /etc/cron.daily/
   /etc/cron.daily/
   |-- 0anacron
   |-- 0logwatch -> /usr/share/logwatch/scripts/logwatch.pl
   |-- cups
   |-- logrotate      ---------> logrotate 日志滚动的任务
   |-- makewhatis.cron
   |-- mlocate.cron
   |-- prelink
   |-- rpm
   `-- tmpwatch
   0 directories, 9 files

查看脚本 run-parts 是任务执行任务的

 
[root@node2 ~]# cat /usr/bin/run-parts
#!/bin/bash
# run-parts - concept taken from Debian
# keep going when something fails
 set +e
if [ $# -lt 1 ]; then
        echo "Usage: run-parts <dir>"
        exit 1
fi
   if [ ! -d $1 ]; then
        echo "Not a directory: $1"
        exit 1
   fi
# Ignore *~ and *, scripts
   for i in $1/*[^~,] ; do
          [ -d $i ] && continue
    # Don't run *.{rpmsave,rpmorig,rpmnew,swp} scripts 排除一些格式的文件
          [ "${i%.rpmsave}" != "${i}" ] && continue
          [ "${i%.rpmorig}" != "${i}" ] && continue
          [ "${i%.rpmnew}" != "${i}" ] && continue
          [ "${i%.swp}" != "${i}" ] && continue
          [ "${i%,v}" != "${i}" ] && continue
         
    # 执行 /etc/cron.daily/的具有可执行权限的文件。
          if [ -x $i ]; then
                  $i 2>&1 | awk -v "progname=$i" \
                                'progname {
                                     print progname ":\n"
                                     progname="";
                                 }
                                 { print; }'
          fi
  done
  exit 0
  说明:
      脚本 run-parts 是先判断目录/etc/cron.daily 的文件,符合条件的再让它去执行。
  查看 /etc/cron.daily/logrotate 任务脚本
  [root@node2 ~]# cat /etc/cron.daily/logrotate
  #!/bin/sh
  /usr/sbin/logrotate /etc/logrotate.conf
  EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
 exit 0

 

说明:
      脚本 run-parts 是先判断目录/etc/cron.daily 的文件,符合条件的再让它去执行。

     查看 /etc/cron.daily/logrotate 任务脚本

 
[root@node2 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
     /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
 exit 0

 说明:
    /usr/sbin/logrotate /etc/logrotate.conf 
    logrotate   日志滚动程序根据配置文件configfile(/etc/logrotate.conf)来对日志的滚动、备份、压缩等操作。

(责任编辑:IT)