linux logrotate 配置说明
文章目录
- 1、logrotate介绍
- 2、配置logrotate
- 2.1、配置方式
- 3、logrotate 参数
- 问题1:rotate 和 maxage 的区别?
- 问题2:create 和 copytruncate 的区别。
- 4、dateformat 配置示例
- 4.1、示列1
- 4.2、示列2
- 4.3、nginx 完整示例
- 5、测试和运行 logrotate
- 5.1、debug 模式:
- 5.2、verbose 模式
- 5.3、force 强制执行
- 6、logrotate 默认运行时间
- 7、crontab 定时
- 7.1、crontab 常用命令
- 8、常见应用的 logrotate 配置
- 1)nginx
1、logrotate介绍
logrotate软件是一个日志管理工具,用于 切割日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间。一般centos系统已经自带安装好了。
logrotate是基于 crontab 运行的,运行时,logrotate 会调用配置文件 /etc/logrotate.conf
。可以在 /etc/logrotate.d
目录里放置自定义好的配置文件,用来覆盖 logrotate.conf
的缺省值。
logrotate 版本查看
root@test 10:14:51:/usr# logrotate --version
logrotate 3.11.0
2、配置logrotate
2.1、配置方式
默认执行脚本: /usr/sbin/logrotate
默认配置文件: /etc/logrotate.conf
自定义配置目录: /etc/logrotate.d/*.conf
/etc/logrotate.conf
通过 include 指令,会引入 /etc/logrotate.d
目录下的自定义的配置文件。
修改配置文件后,并不需要重启服务。 由于 /usr/sbin/logrotate
实际上只是一个可执行文件,不是以 daemon 运行。
默认配置文件: /etc/logrotate.conf
,内容如下:
[root@root /opt]# cat /etc/logrotate.confweekly # 默认每周执行一次日志轮询rotate 4 # 默认保留4个日志文件create # 自动创建新的日志文件,新的文件和原来的文件具有相同的权限dateext # 日志切割后,文件以当前日志为结尾,例如:messages-20181125#compress # 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。include /etc/logrotate.d # 将/etc/logrotate.d目录中的配置文件加载进来/var/log/wtmp { # 针对wtmp日志的配置参数monthly # 每月切割一次create 0664 root utmp # 新建日志的权限为0644,用户为root,组为utmpminsize 1M # 文件大小超过1M后才会切割rotate 1 # 只保留1个日志文件
}/var/log/btmp {missingokmonthlycreate 0600 root utmp #新建日志的权限为0644,属主为root,属组为utmprotate 1
}# system-specific logs may be also be configured here.
/etc/logrotate.d/
目录,通常一些第三方软件包的配置, 如 yum,zabbix-agent,syslog,nginx 等。
下面是 yum 的配置内容:
[root@root logrotate.d]# cat yum
/var/log/yum.log {missingoknotifemptysize 30kyearlycreate 0600 root root
}
3、logrotate 参数
参数 | 说明 |
---|---|
daily weekly monthly yearly |
切割周期,多久切割一次。 daily : 切割周期为 每天 weekly : 切割周期为 每周 monthly : 切割周期为 每月 yearly: 切割周期为 每年 |
size size |
当日志文件到达指定的大小时才转储。 默认单位是 bytes。bytes (缺省) 及 KB (sizek) 或 MB (sizem) 如: size 30k、 size 50M |
rotate count |
日志文件保留备份的个数。默认是 0 。 如:0 指没有备份;5 指保留最近的5个备份,其余的全部删除。 |
maxage count |
保留多少天的日志文件。 如:5 指保留最近的5天的日志文件,其余的全部删除。 如果 日志文件按天转储,则 rotate 与 maxage 基本上是一样的。
|
tabooext [+] list | 让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和~ |
missingok |
missing ok ,在日志轮循期间,错误将被忽略。 例如 “文件无法找到” 之类的错误。 |
copytruncate nocopytruncate |
copytruncate: 用于还在打开中的日志文件,把当前日志备份并截断。 把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志。 nocopytruncate: 备份日志文件,但是不截断 。 |
create mode owner group nocreate |
create mode owner group:转储文件,使用指定的文件模式创建新的日志文件。 nocreate: 不建立新的日志文件。 如: create 644 root root 以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。 |
nocompress compress |
nocompress: 不压缩(默认) compress: 通过 gzip 压缩转储以后的日志。如 XXX.gz |
delaycompress nodelaycompress |
delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩。nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
|
prerotate endscript |
在所有其它指令完成 前 执行。这两个关键字必须单独成行 |
postrotate endscript |
在所有其它指令完成 后 执行。这两个关键字必须单独成行 |
sharedscripts |
共享脚本,整个日志组运行一次脚本 。 比如 nginx 涉及到多个日志文件,一般使用 * 号 通配符:/var/log/nginx/*.log { ... } ,sharedscripts 的作用是在 所有的日志文件 都轮转完毕后 统一执行一次脚本 ;如果没有 sharedscripts ,那么 每个日志文件 轮转完毕后 都会执行一次脚本 。
|
errors address | 转储时的错误信息发送到指定的 Email 地址。 |
mail address nomail |
mail address : 把转储的日志文件发送到指定的 E-mail 地址 nomail : (默认)转储时不发送日志文件 |
ifempty notifempty |
ifempty :if empty ,即使是空文件也转储(默认)。 notifempty :not if empty ,如果是空文件的话,不转储。 |
olddir directory noolddir |
olddir directory :储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统。 noolddir : 转储后的日志文件和当前日志文件放在同一个目录下。 |
dateext |
在日志名称后面,添加日期后缀。默认是当前日期。默认是 -%Y%m%d 的后缀。可用 dateformat 选项扩展配置。如:nginx_access.log --> nginx_access.log-20210120 注意: 格式化日期中不要出现 分号(:) ,因为文件名称是不能含有分号的。
|
dateformat |
对 dateext 的拓展,必须配合 dateext 使用在V3.9.0 之前,只支持 %Y 、%m 、%d 、 %s 参数。%s 不是秒,是时间戳,也者 随机数,具体我没有验证。在V3.9.0 及之后,支持 %H 参数。如: dateformat -%Y-%m-%d 结果:nginx_access.log --> nginx_access.log-2021-01-20 注意: 文件名称中禁止出现 分号(:) ,因为文件名称是不能含有分号的。
|
dateyesterday |
与 dateext 配合使用,日期提前一天。比如,当前日期是2021-01-20,提前一天就是 2021-01-19 |
extension |
与 dateext 、dateformat 配合使用,指定文件的后缀。如:extension .log 结果:nginx_access.log --> nginx_access-2021-01-20.log 说明:nginx_access.log , 文件名是nginx_access,后缀是.log, 文件名 + -%Y-%m-%d 格式的日期 + .log 后缀,结果是 nginx_access-2021-01-20.log
|
问题1:rotate 和 maxage 的区别?
它们都是用来控制保存多少日志文件的,区别在于rotate是以个数为单位的,而maxage是以天数为单位的。如果我们是以按天来轮转日志,那么二者的差别就不大了。
问题2:create 和 copytruncate 的区别。
create 和 copytruncate 都是 创建日志文件,但是差别挺大的。
1)create(创建文件):
这也就是默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是 重命名原日志文件,创建新的日志文件。
详细步骤如下:
重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。
创建新的日志文件,文件名和原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出的日志还是往原日志文件输出。
最后通过某些方式通知程序,重新打开日志文件;由于重新打开日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。
这也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。
不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了 copytruncate
方式。
2)copytruncate(复制、清空):
该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志。
详细步骤如下:
- 将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。
- 清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并没改变,后续日志的输出仍然写入该文件中。
如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。
通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。
4、dateformat 配置示例
4.1、示列1
production.log 转储后的名称是 production.2016-07-10.log
。
dateext
dateformat %Y-%m-%d. # 修改了默认日期后缀,注意后面有一个点(.)/var/test/production.log
{create 755 www-data www-dataextension log # 后缀为log
}
说明,对于 nginx_access.log ,如果 后缀是 log
,则 文件名是 nginx_access.
,
新文件是由 文件名 + %Y-%m-%d.
格式的日期 + log
后缀组成的,结果是 nginx_access.2021-01-20.log
。
4.2、示列2
production.log 转储后的名称是production-2016-07-10.log
。
dateext
dateformat -%Y-%m-%d/var/www/redmine/log/production.log
{extension .log
}
说明:对于 nginx_access.log ,如果 后缀是 .log
,则 文件名是 nginx_access
,
新文件是由 文件名 + -%Y-%m-%d
格式的日期 + .log
后缀 组成的,结果是 nginx_access-2021-01-20.log
。
4.3、nginx 完整示例
[root@root ~]# cat /etc/logrotate.d/nginx /var/log/nginx/*.log { # 日志文件的路径daily # 每天进行日志分割dateext # 日志切割后,文件以当前日志为结尾,例如:access-logs-20181125missingok # 日志不存在分析,分析下一个rotate 30 # 日志保留30份 compress # 转存之后压缩.tar.gzdelaycompress # 日志压缩会被延后到下次分割时进行notifempty # 空文件不转储create 644 nginx nginx # 新日志文件权限sharedscripts # 整个日志组运行一次脚本postrotate[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` # 重启nginx,重新加载日志文件,防止日志无法写入新文件 endscript # 结束脚本}
5、测试和运行 logrotate
具体 logrotate 命令格式如下:
logrotate [OPTION...] <configfile>
-d, --debug :debug 模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。
5.1、debug 模式:
并不会真正进行 rotate 或者 compress 操作,但是会打印出整个执行的流程,和调用的脚本等详细信息。
logrotate -d <configfile>
示例:
myTest_rotate 的配置内容:
## 测试专用
/var/tmp/logtest/myTest.log { size 2krotate 10notifempty dateextdateformat -%Y-%m-%d.create 644 root rootextension log
}
运行:
[root@root local]# logrotate -d /var/tmp/logtest/myTest_rotate
reading config file /var/tmp/logtest/myTest_rotate
extension is now log
Allocating hash table for state file, size 15360 BHandling 1 logsrotating pattern: /var/tmp/logtest/myTest.log 2048 bytes (10 rotations)
empty log files are not rotated, old logs are removed
considering log /var/tmp/logtest/myTest.loglog needs rotating
rotating log /var/tmp/logtest/myTest.log, log->rotateCount is 10
Converted ' -%Y-%m-%d.' -> '-%Y-%m-%d.'
dateext suffix '-2022-01-04.'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].'
glob finding old rotated logs failed
renaming /var/tmp/logtest/myTest.log to /var/tmp/logtest/myTest.-2022-01-04.log
creating new /var/tmp/logtest/myTest.log mode = 0644 uid = 0 gid = 0
5.2、verbose 模式
会真正执行操作,打印出详细信息。
logrotate -v <configfile>
5.3、force 强制执行
如果时间不符合要求,logrotate 也不会真正执行时,如果想要立即执行,查看结果,就使用到了 强制执行模式。
logrotate -f <configfile>
示例:
logrotate -f /var/tmp/logtest/myTest_rotate
6、logrotate 默认运行时间
logrotate 是基于cron 运行的,所以这个时间是由 cron 控制的,具体可以查询 cron 的配置文件/etc/crontab
。
旧版CentOS 的cron 的配置文件是 /etc/crontab
,新版CentOS 改为 /etc/anacrontab
。
[root@root ~]# cat /etc/anacrontab #生效时间是在凌晨3点到22点之间,而且随机延迟时间是45分钟# /etc/anacrontab: configuration file for anacron# See anacron(8) and anacrontab(5) for details.SHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# 添加到作业基本延迟的最大随机延迟RANDOM_DELAY=45# the jobs will be started during the following hours onlySTART_HOURS_RANGE=3-22#period in days delay in minutes job-identifier command1 5 cron.daily nice run-parts /etc/cron.daily7 25 cron.weekly nice run-parts /etc/cron.weekly@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
从上面的内容可以看出:
- 如果机器 没有关机,默认 logrotate(配置文件里设置的是cron.daily)一般会在每天的3点05分到3点50分之间执行, 真实的延迟时间是 RANDOM_DELAY + delay in minutes。
- 如果在3-22 这个时间段内服务器处于 关机状态,则 logrotate 会在机器开机5分钟后执行分割日志的操作。
注意:
不建议直接修改此文件,如果想按照 logrotate 默认时间的执行,可通过 crontab 执行自定义的 logrotate 配置文件。
但是,这时就不能将自定义的配置文件放置在 /etc/logrotat.d/
目录下,应该放置另外的路径,否则就会执行两遍日志分割的操作,执行时间分别是在crontab中定义的时间 和 anacrontab 默认的执行时间,即 3:05-3:50。
7、crontab 定时
logrotate 执行切割的时间有一定的随机性,如果对时间要求特别严格,则推荐使用 crontab 来定时执行 logrotate 文件。
具体实现方法:
1、在 非 /etc/logrotate.d/ 下创建目录,存放 logrotate 配置文件。
例如,在 /etc
目录下创建 logrotate_mytime
目录, 然后 ,将 nginx 的 logrotate 的配置文件 nginx_rotate,放到 /etc/logrotate_mytime
目录下。
2、 添加 crontab 计划任务
在 root 用户下,执行 crontab -e
进入 vim 模式,进行编辑。
[root@root local]# crontab -e#每天 23点59分进行日志切割
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate
也有简单方式,如下:
sudo echo "59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate" > /etc/crontab
如果用非root用户则会报错error: error creating output file /var/lib/logrotate/logrotate.status.tmp: 权限不够
。
说明:
如果 crontab 中定义的执行时间是0点整,建议在 nginx_rotate 里添加上 dateyesterday
选项,因为,日志内容记录的是昨天的,日志名称却是今天的,容易引起歧起。
如果 crontab 中定义的执行时间是23点59分,则不用添加 dateyesterday
选项,因为名称和内容都是当天的,是一致的。
格式:分 时 日 月 周
取值:59 23 * * *
含义:每天的23时59分执行格式:分 时 日 月 周
取值:0 0 * * *
含义:每天的0时0分执行按每周几执行:
每周:周日 周1 周2 周3 周4 周5 周6
取值: 0 1 2 3 4 5 6
示例:
分 时 日 月 周
0 1 * * 3(每周三执行,此处填3;每周日,则填0;每周六,则填6)
3、 重启crontab
# centos6:
service crond restart# centos7:
systemctl restart crond
7.1、crontab 常用命令
查看所有的定时任务
[root@root local]# crontab -l
.....(省略)
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate
.....(省略)
编辑定时任务
[root@root local]# crontab -e # 进入vim 模式
.....(省略)
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate
.....(省略)
8、常见应用的 logrotate 配置
1)nginx
配置文件1:
/var/log/nginx/*.log { # 可以指定多个路径daily # 日志轮询周期,weekly,monthly,yearlyrotate 30 # 保存30天数据,超过的则删除size 100M # 超过100M时分割,单位K,M,G,优先级高于dailycompress # 切割后压缩,也可以为nocompressdelaycompress # 切割时对上次的日志文件进行压缩dateext # 日志文件切割时添加日期后缀dateformat -%Y-%m-%dmissingok # 如果没有日志文件也不报错notifempty # 日志为空时不进行切换,默认为ifemptycreate 640 nginx nginx # 使用该模式创建日志文件sharedscripts # 所有的文件切割之后只执行一次下面脚本postrotateif [ -f /run/nginx.pid ]; thenkill -USR1 `cat /run/nginx.pid`fiendscript
}
配置文件2:
/var/log/nginx/*.log {dailyrotate 30missingoknotifemptyolddir nginx_archivedateextdateformat -%Y-%m-%ddateyesterdaycopytruncate
}
配置文件1与配置文件2的最大区别是日志文件是创建方式,一个是 create,另一个是 copytruncate。
转载:
https://www.cnblogs.com/uglyliu/p/13206868.html
https://www.jianshu.com/p/ec7f1626a3d3
https://blog.csdn.net/liuxiao723846/article/details/100120058
linux logrotate 配置说明相关推荐
- Linux logrotate 使用详解
Linux logrotate Logrotate 简介 logrotate 程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用. ...
- Linux logrotate日志切割详解
1,对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己 ...
- Linux Logrotate日志切割管理
Logrotate 是 linux 系统用来分割日志的系统工具.Logrotate 可以设置为每天.每周.每月或当日志文件达到一定的大小时处理日志文件,提供自动压缩.删除.分割日志文件的功能.一般 C ...
- linux logrotate和nginx什么关系,怎么配置nginx日志最大为5M,详细说明
logrotate是一个 Linux 系统下的日志管理工具.它可以自动切割.压缩.删除旧日志文件,以避免日志文件过大导致磁盘空间不足. nginx是一个高性能的 HTTP 和反向代理服务器.它可以生成 ...
- linux logrotate 服务,Linux下logrotate服务
一.配置文件 Linux系统默认安装logrotate工具,它默认的配置文件在: /etc/logrotate.conf /etc/logrotate.d/ (1)logrotate.conf 是主要 ...
- linux日志怎么进行转储,Linux logrotate命令用法详解:进行日志转储(轮替)
日志轮替之所以可以在指定的时间备份日志,是因为其依赖系统定时任务.如果大家还记得 /etc/cron.daily/ 目录,就会发现这个目录中是有 logrotate 文件的,查看一下这个文件,命令如下 ...
- linux logrotate进行日志分割
logrotate日志分割配置: # cat /etc/logrotate.d/nginx /data/nginx_logs/*.access_log #nginx日志所在目录 { ...
- linux防火墙配置说明,Linux防火墙配置命令参数说明
规则操作参数说明: -A:在所选择的链末添加一条或更多规则: -D:从所选链中删除一条或更多规则.有两种方法:把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则: -R:从选中的链 ...
- linux 忽略错误信息,linux – 由于文件模式错误而忽略/etc/logrotate.conf
我如何做logrotate,当我做logrotate时,我看不出任何效果 root@me-Latitude-E5550:/etc/logrotate.d# cd .. root@me-Latitude ...
最新文章
- 如何写新的C++ OP
- c++框架有哪些_Java Mybatis框架入门教程_v20200726
- 在报No suitable driver found for jdbc:mysql情况下,我是如何一步一步实现jmeter成功连接mysql...
- 基于 Web 的 Linux 终端 WebTerminal
- CentOS 6.6安装Xtrabackup RPM提示缺少libev.so.4()
- scrapy实现post请求与请求传参
- word doc怎么显示base64图片_win10系统word文档打印不出图片怎么办
- UI设计加载动效趋势|可以认真学习临摹的素材模板
- mysql数据库备份oss_Linux(CentOS7)设置自动备份数据库到阿里云OSS(示例代码)
- centos6.5 mysql配置整理
- python fetchall函数_关于python中的查询数据库内容中用到的fetchone()函数和fetchall()函数(转)还有fetchmany()...
- Python多线程好玩弹窗代码
- 数独超难题目_超难数独基本解题法
- 水经注地图发布服务中间件管理界面
- 在windows 2003系统上安装诺基亚pc套件以及笔记本通过PC套件上网
- 数据中心监控软件 - ManageEngine OpManager
- class文件拒绝访问
- dell电脑恢复出厂系统(旧电脑如何重装系统)
- 牛客网C++开发面试经验汇总
- 证明:无理数乘以非零的有理数仍然是无理数
热门文章
- linux分析jstack,jstack命令以及线程转储堆栈分析
- 手机内存卡数据丢失怎么办?
- 一个基于Flask框架做的仿QQ邮箱系统(收发邮件、贝叶斯模型训练、垃圾邮件过滤、个性化标签)
- 相机下载_我使用了几款复古相机App,一并推荐给你,供你选择
- 如何使用JAVA将一段话的词语分出来
- 给 HTML 元素 Hover 态加点料
- 我的世界服务器修复武器的指令是什么,我的世界手机版修复装备指令 | 手游网游页游攻略大全...
- [转]aircrack-ng破解教程
- python祝女朋友纪念日快乐
- 拳头服务器什么时候修复,拳头:今年将修复《英雄联盟》客户端 启动时间降到19秒...