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. 生成1~n的排列(模板),生成可重集的排列(对应紫书P184, P185)

    生成1~n的排列: #include<iostream> using namespace std; void print_permutation(int n, int *A, int cu ...

  2. SpringBoot序列化时间类型的问题

    在使用sringboot的时候因为在配置文件中缺少一个配置项,所以导致查询出来的时间都是long类型的时间格式 因为springboot默认使用的是Jackson 这个时间显然不是我们所需要的,参考官 ...

  3. EF映射——从数据库更新实体

    最近在做ITOO项目,由于更新了数据库,需要重新从数据库映射到实体,本来看过关于EF的学习资料,直接可以从数据库更新到实体,但这种小事也是有很多问题的,必须在更新的时候做好选择.下面分享一下如何从数据 ...

  4. MenuOS扩展(课堂时间作业)

    MenuOS扩展实验 1.编译内核 2.制作根文件系统 rm menu -rf 强制删除原menu文件 git clone https://github.com/mengning/menu.git 从 ...

  5. 远程连接Linux mysql报错:Access denied for user ‘root’@‘localhost’(using password: YES)的解决方法

    在新安装好的Centos7上刚安装好mysql,准备进去看看,但是登陆的时候,发现报错啦: ERROR 1045 (28000): Access denied for user 'root'@'loc ...

  6. stm32自带的flash分布图

    缘由是要用到flash来保存数据,因此查阅了数据手册与参考手册,一般情况下,将要保存的数据存放到比较靠后的地方,page254,page255,4k字节,已经相当多的了,

  7. 关于iPhone X 适配

    直接上代码,具体原理自己搜索网上一大堆 <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  8. (Python) SOAP Web Service (HTTP POST)

    功能很强大,可惜只有试用 https://www.example-code.com/python/soap_web_service.asp

  9. learning java java.time相关类

    var clock = Clock.systemUTC(); System.out.println(clock.instant()); System.out.println(clock.millis( ...

  10. RookeyFrame Bug 编号显示 系统自动生成 的问题,有时候依旧会显示text文本框

    编号显示 系统自动生成 的问题,有时候依旧会显示text文本框 1.在线新建model -> 启用编码规则 -> 新建字段Code(主键) 2.跟Code字段 创建编码规则 3.新增菜单 ...