“Logrotate轮询日志”的版本间的差异

来自linux中国网wiki
跳到导航 跳到搜索
docker>Evan
 
(导入1个版本)

2019年10月14日 (一) 13:48的版本

前言

日志的重要性,作为运维 你懂的! 以前我自己的环境是直接打包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

 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
}

注释:

/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配置文件查看到

[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

其它注意的

问题:如何告诉应用程序重新打开日志文件

以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参数

没有发现异常,系统日志等都是由这个脚本轮询的,一切运行正常,脚本应该就没问题。直接执行命令/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

加错参数dateformat

导致压缩不成功 起因 本来想加个每日压缩的 哈哈
[root@ nginx]# cat /etc/logrotate.d/nginx
/data/logs/nginx/*.log {
        daily
        #dateformat -%Y-%m

logrotate -f -v /etc/logrotate.d/nginx

参考

linux中logrotate对日志进行切割压缩(nginx,mysql) http://www.111cn.net/sys/linux/61133.htm

logrotate管理nginx日志文件 http://blog.linuxchina.net/?p=2321

切割nginx日志 http://www.ilanni.com/?p=11150#1.3 查看logrotate默认执行时间

使用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/ Linux logrotate 命令教程日志分割