潇湘夜雨移动版

主页 > 系统 > 操作系统 >

Linux日志管理和任务计划

1.简介
logrotate是作为linux系统日志的管理工具存在。他可以轮换,压缩,邮件系统日志文件。
其实logrotate功能很简单,正如其名,按一定周期自动循环分割和保存日志防止无限增
长,必要的时候进行压缩、删除,还可以进行邮件通知等功能。 
很多服务器上总会运行着一些会不停生成成吨日志的程序,最简单的比如nginx、httpd
之类的web服务器的访问日志,为了保持这些日志的可检索以及防止无限增长把有限的
硬盘都吃干净了,就会有五花八门的cron脚本来处理这些日志,事实上这些事情都可以
由logrotate代劳。
它默认的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/
 
 
2.配置文件介绍:
========================
logrotate.conf 才主要的配置文件, logrotate.d 是一个目录, 该目录里的所有文件都会被
主动的读入 /etc/logrotate.conf 中执行。
另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以 /etc/logrotate.conf 这
个文件的设定来作为默认值。
 
3.切割介绍:
--------------------------
当第一次执行完 rotate 之后,原本的 messages 会变成 messages.1 而且会制造一个空的
messages 给系统来储存日志。而第二次执行之后, messages.1 会变成 messages.2 而
messages 会变成 messages.1 ,又造成一个空的 messages 来储存日志!如果我们仅设
定保留三个日志而已的话,那么执行第四次时,则 messages.3 这个档案就会被删除,并
由后面的较新的保存日志所取代!也就是会保存最新的几个日志。
 
当然,这个得根据配置文件中的 dateext 参数来判定:
 
先看 logrotate.conf 的内容:
 
vim /etc/logrotate.conf
# 底下的设定是 "logrotate 的默认值" ,如果別的文件设定了其他的值,
# 就会以其它文件的设定为主
 
weekly   #默认一周执行一次 rotate 工作
rotate 4 #保留多少个日志文件.默认保留四个.
create   #创建新的文件.因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext  #文件后缀是日期格式,也就是切割后文件是:xxx.log-20131216.gz 这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1 这种格式
#compress#是否压缩日志.
 
include /etc/logrotate.d
# 将 /etc/logrotate.d/ 目录中的所有文件都加载进来
 
/var/log/wtmp {      #仅针对 /var/log/wtmp 所设定的参数
monthly          #每月一次切割,取代默认的一周
minsize 1M       #文件大小超过 1M 后才会切割
create 0664 root utmp#指定新建的日志文件权限以及所属用户和组
rotate 1         #只保留一个日志.
}
# 这个 wtmp 可记录用户登录系统及系统重启的时间
# 因为有 minsize 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。
 
由这个文件的设定我们可以知道 /etc/logrotate.d 其实就是由 /etc/logrotate.conf 所规划出来的目录,虽然我们可以将所有的配置都给他写入 /etc/logrotate.conf ,
但是这样一来这个文件就实在是太复杂了,尤其是当我们使用很多的服务在系统上面时, 每个服务都要去修改 /etc/logrotate.conf 的设定也似乎不太合理~ 
所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中
示例1:
[root@node3 nginx]# logrotate -d -vf /etc/logrotate.d/nginx 
/var/log/nginx/*log {
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || :
    endscript
}
示例2:
/var/log/nginx/*.log {
        daily
        minsize 1M
        create
        dateext
        missingok
        notifempty
        compress
        delaycompress
        rotate 3
        sharedscripts
        postrotate
        /sbin/service nginx reload > /dev/null 2>/dev/null || true
    endscript
}
 
示例3:
tomcat类的java项目日志输出的路径一般要重启服务后才能定向到新的路径,但是重启这类服务的时间比较长。
所以可以用copytruncate命令对日志截断,而不是重命名。重命名日志后,日志还是会继续写入,这是我们不愿看到的。
/data/src/logs/soa/*.log{
daily
copytruncate
        dateext
        missingok
        notifempty
        compress
        delaycompress
        rotate 10
        sharedscripts
        postrotate
    endscript
}
 
说明:daily:按天处理日志
rotate 12:保留2份日志
compress:日志分割后会进行gzip压缩
delaycompress:最新的日志压缩会被延后到下次分割时进行
missingok:目标日志文件不存在程序也不会报错退出
notifempty:目标日志文件为空时不进行分割操作
create 644 root root:以644也就是rw-r–r–权限来建立分割出来的文件,同时该分割文件所属用户为root,用户组为root
dateext:备份的日志文件的后缀不再是默认的.1 .2 .3的递增格式,而是.YYYYMMDD的日期格式
sharedscripts:配置该选项时,prerotate和postrotate段的脚本会在所有文件被处理结束(被处理前)统一执行,而不是每个文件前后分别执行一次
postrotate:处理日志后,postrotate和endscript构成一个shell语句块,在日志文件被处理后这部分语句会被执行,对应的还有prerotate语句块
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断。可以理解为把内容拷贝走作为备份,然后清空当前文件。但是这有一个问题就是拷贝和截断之间会有时间差,存在丢数据的可能。 
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
 
这样nginx的log文件的处理配置就完成了,但是我们可能还需要确认一下配置的内容到底是否正确呢,这时候可以利用logrotate命令行的debug选项来进行测试,命令如下:
logrotate -d -vf /etc/logrotate.d/nginx #加上-d表示模拟测试,并不会对日志产生影响。-f表示强制执行日志切割命令
[root@node3 nginx]# logrotate  -d -f /etc/logrotate.d/nginx 
reading config file /etc/logrotate.d/nginx
reading config info for /var/log/nginx/*.log 
 
Handling 1 logs
 
rotating pattern: /var/log/nginx/*.log  forced from command line (2 rotations)
empty log files are not rotated, only log files >= 1048576 bytes are rotated, old logs are removed
considering log /var/log/nginx/access.log
  log does not need rotating
considering log /var/log/nginx/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated
 
注意这里测试的参数是完全按照nginx脚本执行的,实际上是运行logrotate.conf脚本执行的,如果nginx中没有定义参数而logrotate中有
就按照logrotate.conf执行,而nginx中已用自定义的参数就按照nginx脚本执行。
 
4.logrotate基本工作原理
作为一个定时处理的管理工具,logrotate本身是个命令行的工具,然而它需要定时处理你的
日志,所以显然logrotate还是得基于cron来工作的,否则就没有人定时来唤醒它让它干活了
,正常情况下logrotate已经作为cron.daily的一个任务每天被定时在执行了,这个定时脚本位
于/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
 
上面这段是centos中默认的logrotate脚本,各个不同版本上的logrotate脚本会有细微的不同,但
是核心都是使用/etc/logrotate.conf配置脚本来启动logrotate。 然而这段脚本只是位于这个目录里
,为什么会被每天调用呢,而且每天什么点调用呢?可以查看CRON的默认配置文件/etc/crontab
(新版CentOS中其默认配置文件位于/etc/anacrontab)的内容:
系统级别的计划任务及其扩展anacrontab anacrontab就是系统计划任务的扩展
文件:在一个指定时间间隔错过后自动执行任务 这个是系统设置好了,清理
系统垃圾或者是自动执行某些脚本的系统任务,一般我们做了解就行了,不要
更改 配置文件是/etc/anaconrtab 
 
# /etc/anacrontab: configuration file for anacron
 
# See anacron(8) and anacrontab(5) for details.
 
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22 #工作将在每天3:22时间开始,可自定义
 
#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily #每天开机5分钟后检查cron.daily文件是否被执行了,如果今天没有被执行就执行他 
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
SHELL:就是运行计划任务的解释器,默认是bash PATH:执行命令的环境变量 
MAILTO:计划任务的出发者用户 
HOME:家目录为/ 
run-parts是一个脚本,在/usr/bin/run-parts,作用是执行一个目录下的所有脚本/程序。 
run-parts /etc/cron.hourly执行目录/etc/cron.hourly/之下的所有脚本/程序. run-parts下面就是运行的命令 
第一行的意思是:每天开机5分钟后就检查cron.daily文件是否被执行了,如果今天没有被执行就执行他 
第二行的意思是:每隔7天开机后25分钟检查cron.weekly文件是否被执行了,如果一周内没有被执行就执行他
 
任务计划执行的日志文件位于/var/spool/cron
 
 
注意:anaconrtab的定时执行计划有一定的延迟,要想在准确的时间点强制执行日志切割,可以通过logrotate  -f  添加到定时任务中。

(责任编辑:liangzh)