在部署网络应用时,会保存日志用于数据统计分析和故障排查,但对于高并发请求的服务器,日志文件会快速增长,消耗磁盘空间快,分析一个用于故障排除的大文件可能会非常慢。因此,我们通常需要按日级别存储日志,并压缩转储或删除旧日志以节省磁盘空间和进行脚本分析。第一次有这个需求的时候,首先想到的是crontab脚本定时执行日志清理脚本。就是先写一个cleanLog.sh,然后让crontab定时执行。这种方法是可行的,但是麻烦又麻烦。这时候,Linux自带的一个工具就比较有用了:logrotate。logrotate:Linux日志文件管理器logrotate(日志轮转工具)可以自动提供日志文件的截断、压缩和轮转功能。logrotate工具默认安装在linux机器上。全局命令在/usr/sbin/logrotate中,它还包含两个配置文件://全局配置文件,存放常用的默认配置项/etc/logrotate.conf//子项配置文件夹,提供一些系统级的日志配置,你自定义的配置也需要在这里配置/etc/logrotate.d/这个工具可以实现自动功能,但是还是依赖于crontab工具,但是这些设置都是系统自动完成的,我们可以查看crontab系统级每日运行脚本:$vim/etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate/etc/logrotate.conf>/dev/null2>&1EXITVALUE=$?if[$EXITVALUE!=0];然后/usr/bin/logger-tlogrotate"ALERTexitedabnormallywith[$EXITVALUE]"fiexit0在crontab的日常级别可以看到配置文件目录下有一个logrotate子项,每天执行logrotate命令,调用的配置是/etc/logrotate.conf。实际执行时,logrotate命令会先读取/etc/logrotate.conf的配置作为默认项,然后读取/etc/logrotate.d/目录下各个文件的配置,以覆盖默认项和执行日志轮转功能。logrotate命令语法:logrotate[OPTION...]参数说明:-d,--debug:调试模式,测试配置文件是否有错误。-f,--force:强制转储文件。-m,--mail=command:压缩日志后,发送日志到指定邮箱。-s,--state=statefile:使用指定的状态文件。-v,--verbose:显示转储过程。logrotate的使用假设我们现在有一个日志文件存储在/home/work/log/nginx.access.log中,我们需要将其拆分为新旧两个日志文件,并删除7天前的旧日志。首先我们新建一个日志轮转配置:$vim/etc/logrotate.d/nginxAccessLog#指定需要轮转的日志文件/home/work/log/nginx.access.log{#日志文件轮转周期,可用取值为:daily/weekly/yearlydaily#新日志文件的权限create0664workwork#轮转次数,即最多存储7条归档日志,最旧的归档日志将被删除rotate7#使用当前日期作为命名格式dateext#轮转结束后,归档日志使用gzipcompress#与compress共享,不压缩最新的归档delaycompress#忽略错误信息missingok#日志文件为空,roundrobin不会continuetoexecutenotifempty#仅当日志文件大于指定大小时才继续执行,单位为bytes(默认)/k/M/Gsize=100M#dump日志文件后执行的命令以endscript结尾,命令需要单独一行postrotate#重启nginx日志服务,写入新文件go,否则还是会写入改名后的文件/bin/kill-USR1`cat/home/work/run/nginx.pid2>/dev/null`2>/dev/null||true#默认logrotate它将以root身份运行。如果你想以另一个身份执行一个命令,你可以这样使用:#su-work-c'/home/work/odp/webserver/loadnginx.shrestart'endscript}在使用它之前,我们先过一遍Let'stake一看,就是调试模式。此时,不是实际的循环,而是模拟输出。使用enforcement是因为round-robin循环还没有到:$logrotate-d-f/etc/logrotate.d/nginxAccessLogreadingconfigfile/etc/logrotate.d/nginxAccessLogread正在为/home/work/log/nginx.access.logHandling1logsrotatingpattern:/home/work/log/nginx.access.logforcedfromcommandline(7rotations)空日志文件被轮换,旧日志被删除consideringlog/home/work/log/nginx.access.loglogneedsrotatingrotatinglog/home/work/log/nginx.access.log,log->rotateCountis7dateextsuffix'-20190228'globpattern'-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'glob查找旧旋转日志失败重命名/home/work/log/nginx.access.log到/home/work/log/nginx.access.log-20190228创建新的/home/work/log/nginx.access.logmode=0664uid=500gid=501runningpostrotatescriptrunningscriptwitharg/home/work/log/nginx.access.log:"/bin/kill-USR1`cat/home/work/run/nginx.pid2>/dev/null`2>/dev/null||true"可以看到整个执行过程,并没有报错信息,此时我们继续执行:$logrotate-f/etc/logrotate.d/nginxAccessLog$ll/home/work/lnmp/log/-rw-r--r--1工作工作02月28日13:40nginx.access.log-rw-r--r--1workwork5379846Feb2813:37nginx.access.log-20190228可以看到我们拆分了日志和最新的日志文件大小之后就可以了为0,系统会自动轮转日志。多文件配置我们可以为一个配置块指定多个文件,支持通配符,多个文件之间用空格分隔:/home/work/log/nginx.access.log/home/work/log/nginx.error。log/home/work/log/mysql.*.log{...}也可以在一个配置文件中指定多个块:/home/work/log/nginx.access.log{...}/home/work/log/nginx.error.log{...}参考Linux日志文件管理器-logrotate:https://linux.cn/article-4126...logrotate-(8)手册页:https://linuxconfig.org/logro...运维中日志切割操作梳理:https://www.cnblogs.com/kevin...Linuxlogrotate命令教程日志切割:https://www.gubo.org/linux-rotate-logs-with-logrotate-实用程序/