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,而“&>”则表示把符号左边的内容以符号右边的形式输出。

(adsbygoogle = window.adsbygoogle || []).push({});

logrotate机制&原理的更多相关文章

  1. logrotate机制与原理[转载]

    http://blog.lightxue.com/how-logrotate-works/ 日志实在是太有用了,它记录了程序运行时各种信息.通过日志可以分析用户行为,记录运行轨迹,查找程序问题.可惜磁 ...

  2. Atitit事件代理机制原理 基于css class的事件代理

    Atitit事件代理机制原理 基于css class的事件代理 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规 ...

  3. Atitit.软件与编程语言中的锁机制原理attilax总结

    Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 (Db,业务数据加锁,并发操作加锁.1 2. 锁得类型 排它锁 "互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁 ...

  4. Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer

    Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...

  5. OAuth的机制原理讲解及开发流程

    本想前段时间就把自己通过QQ OAuth1.0.OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oaut ...

  6. ASP.NET运行机制原理

    ASP.NET运行机制原理 一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去另一台电脑上访问文件一样,只不过 ...

  7. ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻

    一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问 ...

  8. UITableViewCell的重用机制原理

    UITableViewCell的重用机制原理 来自http://blog.csdn.net/omegayy/article/details/7356823 ====================== ...

  9. 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】

    原文:[Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析] [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令 ...

随机推荐

  1. python 判断返回值是否是字典

    背景: 小鱼最近再调一个小工程时,需要对返回值进行处理(返回值如下),有的返回值 有data1 有的没有:需要做个判断,判断是否含有该key值 返回值: res1 = {"result&qu ...

  2. 接口中的xml报文和实体类的之间转换

    需求:湖南保险行业意健险承保风险预警平台数据接口 平台提供HTTPServlet服务,接受保险公司的数据请求,并在处理后返回给保险公司相应的处理结果.数据接口格式为XML数据报文,在每次接口的交易中, ...

  3. python中类的函数中的self

    Python类中的self到底是干啥的 Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的 ...

  4. python - django (logging 日志配置和简单使用)

    1. settings 配置 # 配置日志 LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 's ...

  5. 棋盘覆盖 状压DP+矩阵快速幂

    题意:有一个m 行n 列的矩形方格棋盘,1 < = m< = 5,1=< n< =10^9,用1*2 的骨牌(可横放或竖放)完全覆盖,骨牌不能重叠,有多少种不同的覆盖的方法.你 ...

  6. C语言函数的定义和使用(2)

    一:无参函数 类型说明符 get(){ //函数体 } 二:无参函数 类型说明符 getname(int a,int b){ //函数体 } 三:类型说明符包括: int ,char,float,do ...

  7. noi.ac #38 线段树+时间复杂度分析

    \(des\) 存在参数数组 \(a\),\(a\) 升序排列 \[a_1 < a_2 < \cdots < a_m, m <= 10\] 存在长度为 \(n\) 价值数组 \ ...

  8. 2019暑期金华集训 Day7 动态规划

    自闭集训 Day7 动态规划 LOJ6395 首先发现这个树的形态没啥用,只需要保证度数之和是\(2n-2\)且度数大于0即可. 然后设\(dp_{i,j}\)表示前\(i\)个点用了\(j\)个度数 ...

  9. 关于Ubuntu中snap安装软件太慢解决办法

    两种方法,一是下载好包手动安装,二设置snap的代理. 下载安装包方式 到 https://uappexplorer.com/snaps 搜索需要的 snap 包,然后下载 下载的时候选择对应的平台. ...

  10. 关于nginx反代jenkins报错 反向代理设置有误

    官方文档地址: https://wiki.jenkins.io/display/JENKINS/Running+Jenkins+behind+Nginx 直接解决的配置文件吧. 这是使用子域名,不使用 ...