logrotate机制&原理
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机制&原理的更多相关文章
- logrotate机制与原理[转载]
http://blog.lightxue.com/how-logrotate-works/ 日志实在是太有用了,它记录了程序运行时各种信息.通过日志可以分析用户行为,记录运行轨迹,查找程序问题.可惜磁 ...
- Atitit事件代理机制原理 基于css class的事件代理
Atitit事件代理机制原理 基于css class的事件代理 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规 ...
- Atitit.软件与编程语言中的锁机制原理attilax总结
Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 (Db,业务数据加锁,并发操作加锁.1 2. 锁得类型 排它锁 "互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁 ...
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...
- OAuth的机制原理讲解及开发流程
本想前段时间就把自己通过QQ OAuth1.0.OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oaut ...
- ASP.NET运行机制原理
ASP.NET运行机制原理 一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去另一台电脑上访问文件一样,只不过 ...
- ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻
一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问 ...
- UITableViewCell的重用机制原理
UITableViewCell的重用机制原理 来自http://blog.csdn.net/omegayy/article/details/7356823 ====================== ...
- 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】
原文:[Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析] [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令 ...
随机推荐
- pip---cannot import name main解决方案
.先来看下Python不同版本对应的路径 which python3. which python3. .使用update-alternatives --install建立链接 sudo update- ...
- 使用BERT预训练模型+微调进行文本分类
本文记录使用BERT预训练模型,修改最顶层softmax层,微调几个epoch,进行文本分类任务. BERT源码 首先BERT源码来自谷歌官方tensorflow版:https://github.co ...
- 剑指Offer(三十五):数组中的逆序对
剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...
- selenium 全天课整理(二)
# encoding=utf-8 ''' selenium 全天 二 ''' #unittest例子 from selenium import webdriver import unittest,ti ...
- 帝国CMS熊掌号数据主动推送插件【原创】
因为昨晚一个朋友他是帝国CMS做的网站,叫我给他做个熊掌号改造和熊掌号推送,所以花了一个小时时间做了这个插件,有需要的朋友可以拿去. 第一步:在后台执行以下数据库语句: CREATE TABLE `b ...
- Oralce if ..elsif结构
create or replace procedure sp_pro6(spNo number) is v_job emp.job%type; begin select e.job into v_jo ...
- vue3 RFC初尝试
由于vue3.x还没有正式发布,所以可以通过安装包vue-function-api提前尝试 npm install vue-function-api --save main.js import Vue ...
- Emmet的HTML语法(敲代码的快捷方式)
Emmet的HTML语法(敲代码的快捷方式) 版权声明:本文为网上转载. 所有操作按下“tab”键即可瞬间完成 元素 1.在编辑器中输入元素名称,即可自动补全生成 HTML 标签,即使不是标准 ...
- 洛谷 P1005 动态规划 大数
Problem Description 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n×m的矩阵,矩阵中的每个元素a(i,j)均为非负整数.游戏规则如下: 1 每次取数时须从每行各取走一个元素,共 ...
- VS - Microsoft.Practices.EnterpriseLibrary.Logging
string fileName = AppDomain.CurrentDomain.BaseDirectory + "\\log.txt";File.AppendAllText(f ...