文档章节

你真的搞懂logrotate了吗?

阿dai学长
 阿dai学长
发布于 2017/11/22 15:02
字数 1708
阅读 266
收藏 0

[toc]

logrotate机制&原理

centos系统中默认安装logrotate,logrotate主配置文件:/etc/logrotate.conf,其中定义了系统默认的logrotate规则,当系统中安装了RPM 软件包时,使用include定义其子配置文件的位置:/etc/logrotate.d/*,include选项十分重要,一些应用把日志转储参数存放在/etc/logrotate.d ,典型的应用有:apache,nginx,cron,syslog等,这样,只要管理一个 /etc/logrotate.conf 文件就可以了。
使用时配合crontab定期执行logrotate命令,cron的主配置文件/etc/anacrontab中定义了crontab的默认执行规则,其中系统自带的每1天执行的cron计划配置文件放在/etc/cron.daily/目录下,在该目录下的logrotate文件内容如下:

#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi

该脚本每天定时执行一次,即系统默认的logrotate时间计划。如果想更改系统默认的logrotate时间计划,可以将该文件挪走,然后在crontab中指定自己的时间计划,如:

#每两天执行一次系统日志切割
* * */2 * * /usr/sbin/logrotate -f /etc/logrotate.conf

春雨logrotate

关于logrotate的cron计划在/etc/cron.daily/logrotate,与cron配合使用,春雨弃用系统自带的cron计划,制定cron如下:

春雨cron计划:
17 *   * * *  root    run-parts /etc/cron.hourly
47 23  * * *  root    run-parts /etc/cron.daily
47 6   * * 7  root    run-parts /etc/cron.weekly
52 6   1 * *  root    run-parts /etc/cron.monthly    

即,在每天23:47执行/etc/cron.daily计划下的操作,进行日志切割,logrotate规则配置文件如下:

[root@control ~]$ ls /etc/logrotate.d/

系统日志logrotate过程

  • 执行cron计划
47 23  * * *  root    run-parts /etc/cron.daily
  • 执行/etc/cron.daily的logrotate文件
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
  • 执行/etc/logrotate.conf配置的规则,根据“include /etc/logrotate.d”参数执行/etc/logrotate.d/下的logrotate配置文件,系统日志相关的是syslog:
/var/log/cron
/var/log/maillog
/var/log/secure
/var/log/messages
/var/log/spooler
{
    #每日切割
    daily
    #忽略执行过程中的所有错误
    missingok
    #时间戳,默认是年月日;可以使用dateformat参数自定义
    dateext
    #转储周期为10天,十天前的日志会被删除
    rotate 10
    #不切割空日志文件
    notifempty
    #通常prerotate和postrotate脚本为每一个轮转的日志运行,
    #sharedscripts的作用是使所有的日志轮转完成后再执行脚本
    sharedscripts
    #定义日志切割完成后的操作,作用是重新定义进程日志文件描述符,是日志写入新的日志文件
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

项目日志logrotate过程

nginx日志logrotate过程

/usr/local/nginx/logs/*.log {
daily
dateext
rotate 10
missingok
# 不创建新日志文件
nocreate
# notifempty
# compress  #压缩切割后的日志
sharedscripts
#发送USR1信号来通知Nginx重新打开日志文件
postrotate
    /bin/kill -USR1 `cat /var/run/nginx.pid` || true
endscript
}

该过程与系统日志切割的区别是对新生成的日志文件的处理方式,因为程序日志输出所指向的位置是由文件的iNode号来识别的,所以nginx、uwsgi等程序的日志在切割完成后需要执行postrotate指定的脚本来更新程序所指向的日志文件inode。

uwsgi

/home/workspace/log/uwsgi/uwsgi.*log {
    # 每日轮询
    daily
    # 旧日志文件以更新日期命名
    dateext
    # 最多10个归档日志,多余10个,最早的日志文件被删除
    rotate 10
    # 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
    missingok
    # 不创建新日志文件
    nocreate
    sharedscripts
    postrotate
         /bin/touch /home/workspace/scripts/uwsgi/touch_reopen_log
    endscript
}

关于postrotate

postrotate后面跟随的是一个命令行,一般是用来重新生成日志文件或者冲定义应用所指向的文件描述符(fd:file description),拿nginx和uwsgi为例:

nginx

  • 完成日志切割后创建新的nginx日志文件,此时该文件的fd发生改变
  • nginx中日志输出对应的文件fd未同步更新,nginx会向原fd对应的日志文件写数据
  • “/bin/kill -USR1 cat /var/run/nginx.pid || true”,更新nginx默认日志文件的fd到新建的日志文件(该效果等同于reload)。

uwsgi

  • uwsgi不能通过reload方式创建自己的log文件
  • logrotate配置文件中使用参数create创建新的uwsgi日志文件
  • touch-logreopen参数:当指定的文件被touch过后,会让uwsgi重定向日志输出对应的文件fd,并且不会终止当前的服务(不是stop+start,而是reload的概念)
  • logrotate配置文件postrotate:“/bin/touch /home/workspace/scripts/uwsgi/touch_reopen_log”

日志rotate方式

logrotate提供了两种日志rotate方式,两种方式的区别在于新的日志文件的处理方式。

  • 一种就如上面nginx所述,在完成rotate之后创建新文件,然后更新程序的日志文件描述符指向到新日志文件(即将新日志写入新日志文件) ;
  • 另一种方式叫做copytruncate,该方式是先创建新文件存储旧日志,然后清空旧日志文件(echo “” > old_logfile),此时文件的iNode号不会发生改变,新产生的日志会继续写入旧的日志文件中(可以简单的理解为旧日志内容做了一次备份),需要注意的是,该方法会有部分日志丢失:日志在拷贝完到清空文件这段时间内,程序输出的日志没有备份就清空了。

综上,优先选用第一种方法进行日志切割。

关于/bin/kill -HUP

"/bin/kill -USR1 `cat /var/run/nginx.pid` || true"  

看到这条命令很容易想到:

/bin/kill -HUP `cat /var/run/nginx.pid 2> /dev/null` 2> /dev/null || true

这两条命令的大概含义是重载nginx服务,目的是重新生成nginx的日志文件。

>/dev/null 2>&1,/dev/zero

/dev/null

/dev/null:是设备自带的一个控设备,可以理解为一个黑洞文件,写入它的所有东西都将消失,通常被用于丢弃不需要的输出流。

/dev/zero

在类Unix操作系统中,/dev/zero是一个特殊文件,当你读到它时,它会提供无线的空字符,其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件(在临时增加swap空间时有用到)。

2>&1

这个其实是三个部分组成的:2,>&,1 。在/usr/include/unistd.h中,你可以找到如下代码:

#define STDIN_FILENO    0   #define STDOUT_FILENO   1   #define STDERR_FILENO   2  

2表示stderr;1表示stdout;0表示stdin,而“&>”则表示把符号左边的内容以符号右边的形式输出。

© 著作权归作者所有

阿dai学长
粉丝 73
博文 250
码字总数 327866
作品 0
海淀
运维
私信 提问
logrotate日志轮转

好久不用都快忘了怎么用了,看下原来自己的文档,整理后发出来 #vim /etc/crontab 这个文件里可以指定计划任务的开始时间 #vim /etc/logrotate.d/test test为轮转任务名,可随便起 /var/log...

sw5720
2015/09/16
0
0
思维导图带你看看今天的我们什么也不是

思维导图软件是为大脑的灵活运用而发明创造的的笔记系统,不但能提高效率,还能发散思维。一个好的思维导图软件不光能够激发用户的思路,而且能够为用户提供全面的思维导图软件模板,即使不是...

软件达人
2015/05/06
0
0
没搞过hadoop,没搞过分布式,没搞过nosql是不是很失败???找不到工作了

最近看招聘,漫天都是hadoop 要求nosql,分布式,大数据之类,出了处理多点的数据,其他还真没搞过,是不是要找不到工作了 , 哎,落伍了 基本原理能搞懂,但真没实践经验,可怜搞了5年JAVA了...

爱吃大肉包
2013/01/15
1K
7
告别框架崇拜

挣扎了一天之后,我决定放弃hibernate,仅仅使用struts2来完成我的项目,无关hibernate本身,因为我不得不承认以我现在的水平,真心驾驭不了hibernate。 其实我此前无任何ssh开发的经验,所以...

我要活出个人模狗样
2017/11/30
0
1
程序员鼓励师?这个是神马?真是duang了一下!

长相甜美、微笑常在、了解手机、懂科技,就坐在那儿喊个加油就可以拿20K到30K!这真的是醉了!魅族在招聘“程序员鼓励师”,你造吗? 今年的互联网界比较逗,各招聘网站相继出现程序员鼓励师,...

钟超cody
2015/04/02
3K
10

没有更多内容

加载失败,请刷新页面

加载更多

硬件配置

https://akkadia.org/drepper/futex.pdf sudo lshw -businfo[sudo] lambda 的密码: Bus info Device Class Description======================================......

MtrS
58分钟前
2
0
springmvc的return “success”源码解读

qqqq

architect刘源源
今天
4
0
Java程序员五面阿里分享 逆袭成功 太不容易了!

前言 拿到阿里实习offer,经历了5次面试,其中4轮技术面,1轮HR面试。在这里分享一下自己的面试经验和学习心得。希望能够帮助更多的小伙伴。 我本科毕业于中南大学信管专业,真正开始学习Jav...

别打我会飞
昨天
4
0
Android Camera模块解析之视频录制

《Android Camera架构》 《Android Camera进程间通信类总结》 《Android Camera模块解析之拍照》 《Android Camera模块解析之视频录制》 《Android Camera原理之CameraDeviceCallbacks回调模...

天王盖地虎626
昨天
2
0
手把手教你使用issue作为博客评论系统

自从上周在阮一峰的 每周分享第 60 期 看到了可以将 GitHub 的 issue 当作评论系统,插入第三方网页的 JS 库——utterances。我就对此“魂牵梦绕”。个人博客使用的是VuePress。 TLDR (不多废...

jump--jump
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部