实验环境:RHEL5.8 32Bit

Linux日志系统syslog详解

·日志系统

    我们的操作系统在运行的过程当种会产生很多的信息,这些信息既是我们观察系统运行过程当中正常状况的一种途径,也为我们提供了当系统发生故障的时候定位问题所在的必要信息,因此Linux系统的日志,就相当于我们的航海日志,事实上任何一个操作系统都提供了一个强大的日志系统用于记录各子系统运行过程当中所产生的各种信息。

·信息的详细程度

    根据系统中产生的日志信息的详细程度的不同,我们可以将系统中产生的不同的日志信息分为不同的日志级别,不同的日志系统所支持的日志级别是不一样的,而Linux操作系统上的日志级别通常有固定的几种。

·产生日志的子系统(facility)

    所谓子系统就是系统中可以产生日志信息的各种程序,很显然每一个子系统都有可能产生各种级别的日志信息,所以我们通常定义记录日志信息的时候要指明是记录的哪一个子系统所产生的日志信息,同时还得指明所记录日志信息的日志级别,最后指明日志信息所存储的位置(这个行为叫做action)。

·syslog

    我们通常定义一个日志信息,得基于日志级别、日志子系统(facility)以及action这三种方式进行定义,这就是Linux上的日志系统syslog所完成的功能,Linux上面所用到的日志系统除了syslog之外还有syslog-ng(next generation->下一代:表示升级版的syslog),在红帽5上面我们使用的是syslog,在红帽6上我们使用的是syslog-ng,事实上在红帽系列的操作系统上,syslog和syslog-ng在定义日志的时候所使用的配置文件的格式是比较接近的,syslog-ng有两个版本,开源版本和商业版本,我们要记录系统上产生的日志信息需要有一个专门的程序来完成,这个程序负责专门来接收日志并把日志记录下来,事实上我们的Linux上的每一个程序都可以自己产生日志,还可以自己记录自己所产生的日志,并且自己指定将产生的日志记录到系统上的什么位置上去,但是这样一来系统中的日志信息的记录会比较的混乱,所以有鉴于此,Linux专门创建了一个程序,负责同一记录各程序所产生的日志信息,这个程序就是syslog,syslog是一个服务,专门用于提供记录日志的功能,可以为各程序负责记录日志,每一个程序都可以被记录为一个子系统,虽然syslog是一个统一的日志接口,但并不是所有的程序都会使用这个接口,一般是系统上常见的,固定在系统核心上的子系统会使用syslog来记录日志,syslog服务有两个进程:

    1,sys(system)logd

      专门用于记录非内核的其它子系统所产生的日志信息

    2,k(kernel)logd

      专门用于记录内核所产生的日志信息,klogd所记录的日志的详细程度和syslogd有着巨大的不同,所产生的日志格式相差很大,因此syslogd和klogd各自独立为一个日志系统。

·系统的启动过程

    Bios一旦将系统的控制权转交给Kernel之后,我们的内核就已经实现了初始化,内核初始化的过程中我们的屏幕上会显示出很多信息,这时候的屏幕指的是一个终端:

    我们的终端有很多类型,在内核初始化的时候我们的虚拟终端还没有被启动,虚拟终端是由init这个程序来启动的,所以内核初始化过程中所显示的信息所显示的终端叫做物理终端,之后会进行终端的切换,init启动login程序用于输入账号密码登录系统的终端叫做虚拟终端,使用ssh远程登录的终端称为伪终端,所以Kernel初始化的信息所显示的终端叫做物理终端,物理终端所对应的设备文件是/dev/console,红帽系列的Linux操作系统的内核的初始化信息都会被记录在/var/log/dmesg这个文件当中,该文件可以使用cat命令来查看:

    wKiom1hA5FHR-5hIAAAykaN9tCg485.png

还可以使用一个专门的命令来查看,这个命令就叫做dmesg:

    wKiom1hA5JvQV-L6AAA1SiWpWQo966.png

该命令是专门用于打开该文件并显示出来的命令,内核初始化过程中产生的日志信息,是由klogd负责记录并保存至dmesg文件当中的,一旦内核将系统的控制权限转交给init程序的时候,init所产生的日志信息就由syslogd负责记录,syslogd所记录的日志信息都是非内核日志,和内核相关的日志信息都由klogd来记录,和内核无关的日志信息都由syslogd来记录。

·系统存放日志信息的路径

    系统将日志信息都存放在日志文件当中:

    1,/var/log/messages:

      wKiom1hA5j-S0u78AAAJorDz9rg931.png 

      这个文件叫做系统标准错误日志信息文件,大多数子系统所产生的错误信息都会保存在这个文件里面,这个文件当中所记录的也不都是错误信息,因为不同的日志系统所记录的日志级别也是不同的,该文件所记录的日志信息是非常详细的,一般来说非内核产生的引导信息,即init程序所产生的系统初始化的信息都保存在该文件当中,还有各子系统产生的日志信息也都保存在改文件当中,该文件会进行多次滚动,以免文件变得过大。

·日志文件的滚动

    日志文件的滚动指的是过一段时间,系统会自动将messages文件重命名为messages.1,并且不再向其中写入日志信息,而会再生成一个messgaes文件来保存日志信息,再过一段相同的时间后会将新生成的那个messages文件重命名为messages.2,并且再生成一个名为messages的文件来记录日志信息,等等依次类推,日志文件应该经常进行滚动,以免文件过大导致分析日志不便,日志文件的滚动也称为日志文件的切割:

    wKiom1hBBi6yJIqnAAAZX2kkHds722.png

    我们的系统上有一个专门的程序用来帮助我们完成日志文件的切割,这个程序叫做logrotate,还有一个专门的任务计划来完成日志滚动,这个任务计划在/etc/cron.daily目录下,是一个叫做logrotate的脚本:

    wKiom1hBB56j9czoAAAp_5RzOqQ139.png

    logrotate这个程序的配置文件是/etc/logrotate.conf:

    

  1 # see "man logrotate" for details
  2 # rotate log files weekly
  3 weekly    #表示每周执行一次日志滚动
  4 
  5 # keep 4 weeks worth of backlogs
  6 rotate 4    #表示只保留四个版本的日志文件,超出4个版本的messages文件全部会被清除
  7         
  8 # create new (empty) log files after rotating old ones
  9 create    #表示当日志文件完成滚动之后自动创建一个新的日志文件messages
 10 
 11 # uncomment this if you want your log files compressed
 12 #compress
 13 #以上均是全局定义
 14 # RPM packages drop log rotation information into this directory
 15 include /etc/logrotate.d    #表示将/etc/logroatate.d目录下的所有文件都包含进该配置文件
 16                             #该目录下有很多的文件,这些文件用来定义每一个子系统的日志动
                                #机制
    #接下的内容是对每一个子系统的日志滚动机制进行分别的定义
 17 # no packages own wtmp -- we'll rotate them here
 18 /var/log/wtmp {    #指定一个日志文件
 19     monthly        #按月滚动,如果这里没有定义滚动周期,那么就按照全局定义的滚动周期进
                       #行滚动
 20     minsize 1M     #日志文件的大小最小为1M
 21     create 0664 root utmp    #创建一个新的日志文件,该文件的权限为0644,属主为root,新
                                 #的日志文件名是utmp
 22     rotate 1       #只保留一个版本的日志文件
 23 }  
 24 #我们可以如此来自定义某一个日志文件的滚动机制
 25 /var/log/btmp {
 26     missingok
 27     monthly
 28     minsize 1M
 29     create 0600 root utmp
 30     rotate 1
 31 }
 32 
 33 # system-specific logs may be also be configured here.

    /etc/logrotate.d目录下的文件用来定义每一个子系统的日志文件的滚动机制:

    wKiom1hBC06DI2EVAAAYfPDvhxY139.png

    我们系统上还有一个日志文件叫做/var/log/maillog,该日志文件用来记录邮件子系统所产生的日志信息,邮件子系统默认在我们安装完成它之后都会自动启动邮件服务的,所以每次的邮件往来都会在邮件日志文件里面:

    wKioL1hBDIHBO4jLAAAJQePrOl4708.png

    还有一个叫做/var/log/secure的日志文件,该日志文件的权限比较独特:

    wKiom1hBDKuiSH9ZAAAMfGHCo94484.png

    一般不允许其他用户随意查看,因为这个文件里面记录了所有用户登录系统的登录信息:

    wKiom1hBDSGA15mmAAAmNoDsDdI739.png

    我们的系统上最主要的日志系统就是这么三个/var/log/messages、/var/log/maillog以及/var/log/secure,系统上的所有日志文件都放在/var/log目录下,不接受syslog管理的日志信息也可以直接放在/var/log目录下。

    syslogd和klogd这两个进程作为服务进程,会经常在线,且实时运行,日志系统syslog的配置文件是/etc/syslog.conf:

    

1 # Log all kernel messages to the console.
  2 # Logging much else clutters up the screen.
  3 #kern.*                         /dev/console
  4 
  5 # Log anything (except mail) of level info or higher.
  6 # Don't log private authentication messages!
  7 *.info;mail.none;authpriv.none;cron.none        /var/log/messages
      #none表示不包括该子系统产生的日志信息
  8 
  9 # The authpriv file has restricted access.
 10 authpriv.*                      /var/log/secure
 11 
 12 # Log all the mail messages in one place.
 13 mail.*                          -/var/log/maillog  #-表示异步写入
     #异步写入表示不会立即写入磁盘,会先写进内存中进行保存,不加-表示同步写入磁盘
     #表示日志信息需要在写入内存的同时,同步写入磁盘中去
 14 
 15 
 16 # Log cron stuff
 17 cron.*                          /var/log/cron
 18 
 19 # Everybody gets emergency messages
 20 *.emerg                         *  #*表示将emerg级别以及emerg级别之上的所有日志信息
                                       #通知登录系统的所有用户
 21 
 22 # Save news errors of level crit and higher in a special file.
 23 uucp,news.crit                      /var/log/spooler
 24 
 25 # Save boot messages also to boot.log
 26 local7.*                        /var/log/boot.log #该文件的内容是和引导有关的日志信息

    该文件的格式是:

        facility(日志源).priority(日志级别)    action(日志的存储位置)

    常用的facility有以下几种:

    ->auth    #和认证相关的日志信息由auth来记录

    ->authpriv    #和权限、授权相关的日志信息由authpriv来记录

    #故我们用户在登录系统的时候所产生的日志信息由auth和authpriv这两个子系统来记录

    ->cron    #和任务计划相关的日志信息由cron来记录

    ->daemon    #和守护进程相关的日志信息由daemon来记录

    ->kern    #和内核相关的日志信息由kern来记录

    ->lpr    #和打印相关的日志信息由lpr来记录

    ->mail    #和邮件相关的日志信息由mail来记录

    ->mark    #和标记相关的日志信息由mark来记录

    ->news    #和新闻组相关的日志信息由news来记录

    ->security    #和安全相关的日志信息由security来记录,security和auth相似

    ->syslog    #日志系统记录自己所产生的日志信息

    ->user    #和用户相关的日志信息由user来记录

    ->uucp    #和unix to unix cp相关的日志信息由uucp来记录

    ->local0-local7    #用于让用户自定义使用

    ->*    #表示所有的日志源

    #以上就是目前syslog所支持的所有facility

    常用的priority(log level->日志级别),级别从低到高如下所示:

    ->debug(最低级别,级别越低,记录的日志信息越详细)    #表示程序或系统的调试信息

    ->info    #一般信息

    ->notice    #不影响正常功能,只是需要注意的信息

    ->warning/warn(警告)    #可能会影响系统功能,需要提醒用户的重要事件

    ->err/error    #错误信息

    ->crit    #比较严重的信息

    ->alert    #必须马上处理的信息

    ->emerg/panic(恐慌)    #会导致系统不可用的信息

    ->*    #表示所有的日志级别

    ->none    #和*相反,表示什么都没有

    常用的action:

    ->系统上的绝对路径    #存储至普通文件,如:/var/log/xxx

    ->|    #管道,表示将日志信息送给其他命令进行处理

    ->终端    #显示到终端,如:/dev/console

    ->@HOST(@另外一个主机的主机名或IP地址)    #产生的日志信息发送给其他主机,并由其他主机来记录

    ->用户    #表示产生的日志信息发送给用户

    ->*    #表示将产生的日志信息发送给登录到系统上的所有用户进行处理

·练习

    syslog配置文件格式识别练习:

     ->mail.info    /var/log/mail.log

      #表示将mail产生的的info级别以及info级别以上的所有信息全部记录在/var/log/mail.log文件当中

    ->auth.=info    @10.0.0.1

     #表示将auth产生的info级别的日志信息记录在主机10.0.0.1上面

    ->user.!=error    

     #表示除了error级别意外的其他级别的日志信息全部都记录

    ->user.!error

     #只记录低于error日志级别的级别的日志信息

    ->*.info

     #记录所有可能产生日志信息的子系统的info及info级别以上的日志信息

    ->mail.*

     #记录mail产生的所有日志级别的日志信息

    ->*.*

     #记录所有可能产生日志信息的子系统的所有日志级别的日志信息

    ->cron.info;mail.info

     #记录cron和mail产生的info以及info级别以上的日志信息

     #多个子系统之间使用分号隔开

    #如果两个子系统的日志级别相同的话,还可以用如下的方式去定义:

    ->cron,mail.info

    ->mail.*;mail.!=info

     #记录mail产生的除了info级别之外的所有日志级别的日志信息

    

    由此我们就可以手动去修改syslog的配置文件,该配置文件在修改之后不会立即生效,要想立即生效得重启syslog服务,但是不建议重启服务来使得配置文件生效,因为如果我们重启syslog服务,syslog就无法接收到重启这一刻的日志信息了,但是我们可以给syslog服务传递reload参数,reload参数表示无需重启服务就可以读取服务的配置文件,并且使得配置文件的改动生效,所以说给syslog传递reload参数,就相当于给syslog服务发送1号信号SIGHUP,syslog这个服务脚本也有自己的配置文件,在/etc/sysconfig目录下,叫做syslog:

    

 1 # Options to syslogd
  2 # -m 0 disables 'MARK' messages.
  3 # -r enables logging from remote machines
  4 # -x disables DNS lookups on messages recieved with -r
  5 # See syslogd(8) for more details
  6 SYSLOGD_OPTIONS="-r -m 0"    #-r选项表示syslog可以作为日志服务器来使用
  7 # Options to klogd
  8 # -2 prints all kernel oops messages twice; once for klogd to decode, and
  9 #    once for processing with 'ksymoops'
 10 # -x disables all klogd processing of oops messages entirely
 11 # See klogd(8) for more details
 12 KLOGD_OPTIONS="-x"
 13 #
 14 SYSLOG_UMASK=077
 15 # set this to a umask value to use for all log files as in umask(1).
 16 # By default, all permissions are removed for "group" and "other". 
~                                                                                    
~