“Logrotate轮询日志”的版本间的差异
docker>Evan (→参考) |
(→参考) |
||
(未显示同一用户的1个中间版本) | |||
第114行: | 第114行: | ||
http://www.111cn.net/sys/linux/61133.htm | http://www.111cn.net/sys/linux/61133.htm | ||
− | + | ||
− | http://blog.linuxchina.net/?p=2321 | + | [http://blog.linuxchina.net/?p=2321 logrotate管理nginx日志文件] |
切割nginx日志 | 切割nginx日志 | ||
http://www.ilanni.com/?p=11150#1.3 查看logrotate默认执行时间 | http://www.ilanni.com/?p=11150#1.3 查看logrotate默认执行时间 | ||
+ | |||
+ | [https://blog.csdn.net/molaifeng/article/details/82667158 Nginx 日志分割] | ||
+ | |||
使用logrotate轮询nginx和apache日志 | 使用logrotate轮询nginx和apache日志 |
2019年12月6日 (五) 03:09的最新版本
目录
前言
日志的重要性,作为运维 你懂的! 以前我自己的环境是直接打包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
切割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