查看“Logrotate轮询日志”的源代码
←
Logrotate轮询日志
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
==前言== 日志的重要性,作为运维 你懂的! 以前我自己的环境是直接打包rpm 包 加上 日志切割的,没去理,今天有台以前的机器因log爆硬盘了,于是没事记录一下 网上很多教程都推荐什么 诸如每天切分Nginx日志之类的shell 脚本 然后cront定时跑,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是尴尬呀 为什么不用现成,剩下的时间少点写代码,多点陪陪家人,泡泡妹子呀 !就好比明明身边有美女,你却忙着玩王者荣耀,罪过!当然 如果是喜欢游戏的妹子,那是另外一回事! ===定义=== logrotate is a bash script which can rotate log files and multilog log directories and archive them in a central location.logrotate requires GNU bash, GNU gzip and GNU date. logrotate 是一个 Bash 的 SHELL 脚本,可对日志文件进行切分,并将切分后的日志放在统一目录。 logrotate 要求 GNU bash, GNU gzip and GNU date. ==主体== logrotate的配置文件是/etc/logrotate.conf,而/etc/logrotate.d/是用于存储其他配置文件的目录。该目录里的所有文件都会被主动的读入 /etc/logrotate.conf中执行。 ===logrotate=== <pre> vi /etc/logrotate.d/nginx /usr/local/nginx/logs/*log { daily rotate 10 missingok notifempty compress sharedscripts postrotate if [ -f /usr/local/nginx/nginx.pid ]; then #/etc/init.d/nginx restart kill -HSR1 `cat /usr/local/nginx/nginx.pid` fi endscript } </pre> ===注释:=== /var/log/nginx/*log:需要轮询日志路径 daily:每天轮询 日志文件将按天轮循。 weekly:日志文件将按周轮循。 monthly:日志文件将按月轮循。 rotate 10:保留最多10次滚动的日志 时间最久的那个日志文件将被删除。 这个参数。如果不配置默认是0个,也就是只允许存在一份日志,刚切分出来的日志会马上被删除。多么痛的领悟,说多了都是泪。 missingok:如果日志丢失,不报错继续滚动下一个日志 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。 notifempty:当日志为空时不进行滚动 compress:旧日志默认用gzip压缩 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。 /var/run/nginx.pid:nginx主进程pid dateext:定义日志文件后缀是日期格式,也就是切割后文件是:xxx.log-20160402.gz这样的格式。如果该参数被注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式。 delaycompress:总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。 create 640 nginx adm:以指定的权限和用书属性,创建全新的日志文件,同时logrotate也会重命名原始日志文件。 postrotate/endscript:在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd进程将立即再次读取其配置并继续运行。注意:这两个关键字必须单独成行。 sharedscripts的作用是什么? 大家可能注意到了,我在前面Nginx的例子里声明日志文件的时候用了星号通配符,也就是说这里可能涉及多个日志文件,比如:access.log和error.log。说到这里大家或许就明白了,sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。 ==logrotate默认执行时间== logrotate切割时间默认是在每天的3:22。这个时间点可以通过crontab配置文件查看到 <pre>[root@ddmin]# cat /etc/anacrontab # /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 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly</pre> ==其它注意的== ===问题:如何告诉应用程序重新打开日志文件=== 以Nginx为例,是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约定,比如说MySQL是通过flush-logs来重新打开日志文件的。更有甚者,有些应用程序就压根没有提供类似的方法,此时如果想重新打开日志文件,就必须重启服务,但为了高可用性,这往往不能接受。还好Logrotate提供了一个名为copytruncate的指令,此方法采用的是先拷贝再清空的方式,整个过程中日志文件的操作句柄没有发生改变,所以不需要通知应用程序重新打开日志文件,但是需要注意的是,在拷贝和清空之间有一个时间差,所以可能会丢失部分日志数据。 BTW:MySQL本身在support-files目录已经包含了一个名为mysql-log-rotate的脚本,不过它比较简单,更详细的日志轮转详见「Rotating MySQL Slow Logs Safely」。https://engineering.groupon.com/2013/mysql/rotating-mysql-slow-logs-safely/ ===logrotate无法自动轮询日志=== ==== force参数==== <pre> 没有发现异常,系统日志等都是由这个脚本轮询的,一切运行正常,脚本应该就没问题。直接执行命令/usr/sbin/logrotate /etc/logrotate.conf系统日志是正常轮询了,但nginx日志却没反应。 再man logrotate看下说明发现一个选项-f (–force),大概意思是:强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。 那应该有可能是logroate认为nginx日志太小,不进行轮询,但我们需要轮询,加-f选项即可。即 为什么 是第二次才是压缩了呢 /usr/sbin/logrotate -f -v /etc/logrotate.conf crontab #这个其实一般不要 除非切割不了 * 4 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx > /dev/null 2>&1</pre> ==== 加错参数dateformat ==== <pre> 导致压缩不成功 起因 本来想加个每日压缩的 哈哈 [root@ nginx]# cat /etc/logrotate.d/nginx /data/logs/nginx/*.log { daily #dateformat -%Y-%m logrotate -f -v /etc/logrotate.d/nginx</pre> ==参考== linux中logrotate对日志进行切割压缩(nginx,mysql) http://www.111cn.net/sys/linux/61133.htm [http://blog.linuxchina.net/?p=2321 logrotate管理nginx日志文件] 切割nginx日志 http://www.ilanni.com/?p=11150#1.3 查看logrotate默认执行时间 [https://blog.csdn.net/molaifeng/article/details/82667158 Nginx 日志分割] 使用logrotate轮询nginx和apache日志 https://www.centos.bz/2011/12/logrotate-nginx-log/ logrotate无法自动轮询日志的原因 https://www.centos.bz/2011/12/logrotate-can-not-auto-cut-logfile/ 被遗忘的Logrotate https://huoding.com/2013/04/21/246 鸟哥logrotate http://cn.linux.vbird.org/linux_basic/0570syslog_3.php linux下logrotate 配置和理解 http://blog.csdn.net/cjwid/article/details/1690101 这个教程不错哦 logrotate机制和原理 http://blog.lightxue.com/how-logrotate-works/ linux下logrotate 配置和理解 http://blog.csdn.net/cjwid/article/details/1690101 使用logrotate分割tomcat日志 https://www.52os.net/articles/using-logrotate-manage-tomcat-logs.html Linux日志文件总管——logrotate https://linux.cn/article-4126-1.html http://iain.cx/src/logrotate/ [https://www.gubo.org/linux-rotate-logs-with-logrotate-utility/ Linux logrotate 命令教程日志分割] [[category:ops]] [[category:nginx]]
返回至
Logrotate轮询日志
。
导航菜单
个人工具
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
我的导航
关于我
shell
python
ops
linuxchina.net
blog.linuxchina
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
页面信息