日志系统有三部分组成:
一、使用什么工具记录系统产生的日志信息? syslog服务脚本管理的两个进程: syslogd、klogd 来记录系统产生的日志信息; klogd 进程是专门为内核产生的日志信息服务的。 syslogd 进程是专门为应用程序服务(除了内核)产生的日志信息服务的; 只有调用了 logger 接口,应用程序才可以调用 syslogd工具帮助记录日志信息。二、只要系统服务在运行,就会产生日志信息,我们使用专门的工具把它记录到磁盘上了,为了方便
分析日志,日志文件不能太大、很久以前的日志文件我们应该把它删掉。这些工作由谁完成呢?
使用 logrotate 命令来滚动,syslog记录的日志文件。三、为了让人们从繁忙的工作中解脱出来。自动化管理:日志文件的滚动、备份、压缩等工作。
使用两个忠实的劳动者(进程):crond 和 anacron ,完成上述的所有工作。
看看它们各部分的实现过程:
centos6.X 系统日志配置文件位置发生了变化:在centos6.x系统中,系统日志的配置文件已经发生了变化,不再是原来的/etc/syslog.conf了,在centos6.x中已经变为/etc/rsyslog.conf,这个大家注意下
1、syslog syslog 只是用来管理 sysogd 和 klogd 的服务脚本。它们的配置文件在 /etc/syslog.conf
配置文件格式:
facility.priority /path facility 是用来定义由谁产生的日志信息:那个软件、子系统运行过程中产生的日志信息。 priority 是用来定义记录什么类型的日志信息。是应用程序产生的所有信息都把它记录到日志文件中呢,还是只记录该应用程序的错误日志信息等等。
/path/file_name 是用来定义把日志信息写到哪里去。查看常见的facility和priority:
syslog 有统一的日志文件格式,方便管理员阅读。
Linux 系统日志文件的标准格式: 事件发生的时间 哪台主机的日志 产生日志信息的系统 系统发生的事件 它们各字段之间使用空格隔开。说明:
事件发生的时间: Jun 12 10:01:01 哪台主机的日志: node2 产生日志信息的系统: crond[5490] 系统发生的事件: CMD (run-parts /etc/cron.hourly)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)来对日志的滚动、备份、压缩等操作。