Linux 日志系统组成详解

简介:

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

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

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

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

 wKiom1OZvtnDg8k0AAFOCcMsYjo100.jpg

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     [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:

1
2
3
4
5
6
7
8
9
10
[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 系统日志文件的标准格式:
                                 事件发生的时间    哪台主机的日志    产生日志信息的系统    系统发生的事件
       它们各字段之间使用空格隔开。

1
2
[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)

1
2
3
[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 记录的日志文件进程滚动的?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[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
     }
1
2
3
4
5
6
7
8
9
10
11
12
[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 服务的日志文件的滚动配置文件。

1
2
3
4
5
6
7
8
9
10
11
[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服务器的日志是否滚动

1
2
3
4
    [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 选项强制执行日志文件的滚动

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

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

1
2
3
4
5
6
    [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 任务执行结束后,
   任何输出将作为邮件发送给安排周期性任务的所有者。

1
2
3
4
5
6
7
8
9
10
   [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 目录中定义很多要执行的可执行脚本,这些脚本就是要执行的任务。
   
   查看每天的计划任务有哪些?

1
2
3
4
5
6
7
8
9
10
11
12
    [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 是任务执行任务的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[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  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 任务脚本

1
2
3
4
5
6
7
8
[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)来对日志的滚动、备份、压缩等操作。




     本文转自成长的小虫 51CTO博客,原文链接:http://blog.51cto.com/9528du/1425575,如需转载请自行联系原作者



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
18天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
72 1
|
28天前
|
Shell Linux C语言
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
29 0
|
28天前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
48 0
|
4月前
|
存储 监控 数据可视化
小白带你学习linux的ELK日志收集系统
小白带你学习linux的ELK日志收集系统
157 0
|
4月前
|
监控 安全 NoSQL
5 个适用于 Linux 的开源日志监控和管理工具
5 个适用于 Linux 的开源日志监控和管理工具
265 0
|
4月前
|
Kubernetes Shell Linux
linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
58 0
|
11天前
|
存储 监控 安全
Linux系统日志
【4月更文挑战第6天】Linux系统日志,关键用于记录系统状态和事件,包括内核、系统、安全和应用日志,助力管理员诊断问题、确保系统正常运行。日志管理涉及收集、分析、备份等,常用工具如rsyslog、systemd-journal和logrotate(用于日志轮转)。重视日志文件的存储管理,防止空间占用过多。
16 1
Linux系统日志
|
4天前
|
SQL 监控 安全
Linux&Windows 日志分析 陇剑杯 CTF
Linux&Windows 日志分析 陇剑杯 CTF
29 0
|
18天前
|
运维 监控 安全
linux日志分析与追踪
在Linux中,日志分析涉及检查 `/var/log` 下的不同文件,如`messages`、`auth.log`、`kern.log`等,以及Web服务器和数据库日志。使用`tail`、`grep`、`awk`等工具实时查看和搜索日志,`logrotate`管理日志大小,`journalctl`处理Systemd日志,而`Splunk`等工具则用于集中式分析。分析技巧包括异常检测、时间关联和阈值监控。安全事件追踪结合登录失败日志、网络嗅探和IDS/IPS。日志链路追踪在分布式系统中尤为重要,帮助定位服务调用问题。有效的日志管理和分析能增强系统安全和故障排除能力。
20 7
|
28天前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 实时监控日志文件 swatch命令 使用指南
【Shell 命令集合 系统管理 】Linux 实时监控日志文件 swatch命令 使用指南
33 1