网站首页 > 精选教程 正文
logrotate 是一个 linux 系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间 / 大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。
logrotate 是基于 crontab 运行的,所以这个时间点是由 crontab 控制的,具体可以查询 crontab 的配置文件 /etc/anacrontab。 系统会按照计划的频率运行 logrotate,通常是每天。在大多数的 Linux 发行版本上,计划每天运行的脚本位于 /etc/cron.daily/logrotate。
一、logrotate运行机制
logrotate 在很多 Linux 发行版上都是默认安装的。系统会定时运行 logrotate,一般是每天一次。系统是这么实现按天执行的。crontab 会每天定时执行 /etc/cron.daily 目录下的脚本,而这个目录下有个文件叫 logrotate。在 centos 上脚本内容是这样的:
系统自带 cron task:/etc/cron.daily/logrotate,每天运行一次。
[root@gop-sg-192-168-56-103 logrotate.d]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
可以看到这个脚本主要做的事就是以 /etc/logrotate.conf 为配置文件执行了 logrotate。就是这样实现了每天执行一次 logrotate。
因为我的系统执行 /etc/cron.daily 目录下的脚本不是我想滚动日志的时间,所以我把 /etc/cron.daily/logrotate 拷了出来,改了一下 logrotate 配置文件的路径,然后在 crontab 里加上一条指定时间执行这个脚本的记录,自定义周期滚动日志就大功告成了。这种自定义的方式有两点要注意:
- 配置文件里一定要配置 rotate 文件数目这个参数。如果不配置默认是 0 个,也就是只允许存在一份日志,刚切分出来的日志会马上被删除。多么痛的领悟,说多了都是泪。
- 执行 logrotate 命令最好加 -f 参数,不然有时候配置文件修改的内容不生效。
很多程序的会用到 logrotate 滚动日志,比如 nginx。它们安装后,会在 /etc/logrotate.d 这个目录下增加自己的 logrotate 的配置文件。logrotate 什么时候执行 /etc/logrotate.d 下的配置呢?看到 /etc/logrotate.conf 里这行,一切就不言而喻了。
include /etc/logrotate.d
二、logrotate原理
logrotate 是怎么做到滚动日志时不影响程序正常的日志输出呢?logrotate 提供了两种解决方案。 1. create 2. copytruncate
2.1、Linux 文件操作机制
介绍一下相关的 Linux 下的文件操作机制。
Linux 文件系统里文件和文件名的关系如下图。
目录也是文件,文件里存着文件名和对应的 inode 编号。通过这个 inode 编号可以查到文件的元数据和文件内容。文件的元数据有引用计数、操作权限、拥有者 ID、创建时间、最后修改时间等等。文件件名并不在元数据里而是在目录文件中。因此文件改名、移动,都不会修改文件,而是修改目录文件。
借《UNIX 环境高级编程》里的图说一下进程打开文件的机制。
进程每新打开一个文件,系统会分配一个新的文件描述符给这个文件。文件描述符对应着一个文件表。表里面存着文件的状态信息(O_APPEND/O_CREAT/O_DIRECT...)、当前文件位置和文件的 inode 信息。系统会为每个进程创建独立的文件描述符和文件表,不同进程是不会共用同一个文件表。正因为如此,不同进程可以同时用不同的状态操作同一个文件的不同位置。文件表中存的是 inode 信息而不是文件路径,所以文件路径发生改变不会影响文件操作。
2.2、create
这也就是默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是重命名原日志文件,创建新的日志文件。详细步骤如下:
- 重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。
- 创建新的日志文件,文件名和原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出的日志还是往原日志文件输出。
- 最后通过某些方式通知程序,重新打开日志文件;由于重新打开日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。
如上也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。
不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了如下方式。
2.3、copytruncate
该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志;详细步骤如下:
- 将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。
- 清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并没改变,后续日志的输出仍然写入该文件中。
如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。
通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。
三.logrotate安装配置
[root@mayi ~]# yum -y install epel-release
[root@mayi ~]# yum install -y logrotate
3.1、修改默认配置文件
vim /etc/logrotate.conf
修改weekly为daily #daily为每天切割日志
修改rotate 4为rotate 30 #30表示只保留30天日志
3.2、为nginx做切割日志
[root@mayi ~]# mkdir -p /data/logs/nginx
[root@mayi ~]#cat > /etc/logrotate.d/nginx << EOF
/data/logs/access.log #需要切割的nginx日志路径
{
daily #表示每天切割一次
dateext #表示切割后的日志会增加一个日期格式
dateformat %Y%m%d #添加的日期格式为年月日
extension .log #后缀为.log
notifempty #如果日志为空,就不重新新建日志
rotate 30 #日志保留为30天
olddir /data/logs/nginx #用来存放被分割后日志文件的目录
sharedscripts #下面是脚本内容,具体nginx.pid路径为nginx日志设置
postrotate
[ ! -f /usr/local/logs/nginx.pid ] || /bin/kill -USR1 `cat /usr/local/logs/nginx.pid`
endscript
}
EOF
常见配置参数
- daily :指定转储周期为每天
- weekly :指定转储周期为每周
- monthly :指定转储周期为每月
- rotate count :指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份
- tabooext [+] list:让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和~
- missingok:在日志轮循期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。
- size size:当日志文件到达指定的大小时才转储,bytes (缺省) 及 KB (sizek) 或 MB (sizem)
- compress: 通过 gzip 压缩转储以后的日志
- nocompress: 不压缩
- copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
- nocopytruncate: 备份日志文件但是不截断
- create mode owner group : 转储文件,使用指定的文件模式创建新的日志文件
- nocreate: 不建立新的日志文件
- delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
- nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
- errors address : 专储时的错误信息发送到指定的 Email 地址
- ifempty :即使是空文件也转储,这个是 logrotate 的缺省选项。
- notifempty :如果是空文件的话,不转储
- mail address : 把转储的日志文件发送到指定的 E-mail 地址
- nomail : 转储时不发送日志文件
- olddir directory:储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
- noolddir: 转储后的日志文件和当前日志文件放在同一个目录下
- prerotate/endscript: 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
3.3、为php-fpm做切割日志
[root@mayi ~]# mkdir -p /data/logs/php
[root@mayi ~]# cat > /etc/logrotate.d/php <<EOF
/data/logs/php-fpm.log
{
daily
dateext
dateformat %Y%m%d
extension .log
notifempty
rotate 30
olddir /data/logs/php
sharedscripts
postrotate
[ ! -f /var/run/php-fpm/php-fpm.pid ] || /bin/kill -USR1 `cat /var/run/php-fpm/php-fpm.pid`
endscript
}
EOF
3.4、为php-slow做切割日志
[root@mayi ~]# mkdir -p /data/logs/php_slow
[root@mayi ~]# cat > /etc/logrotate.d/php_slow <<EOF
/data/logs/www.log.slow
{
daily
dateext
dateformat %Y%m%d
extension .log
notifempty
rotate 30
olddir /data/logs/php_slow
sharedscripts
postrotate
[ ! -f /var/run/php-fpm/php-fpm.pid ] || /bin/kill -USR1 `cat /var/run/php-fpm/php-fpm.pid`
endscript
}
EOF
3.5、为mysql_slow做切割日志
[root@mayi ~]# mkdir -p /data/logs/mysql_slow
[root@mayi ~]# cat > /etc/logrotate.d/mysql_slow << EOF
/data/mysqlp/mysql-slow.log
{
daily
dateext
extension .log
notifempty
rotate 30
olddir /data/logs/mysql_slow
sharedscripts
postrotate
/usr/bin/mysqladmin -u root -p123 -S /usr/local/mysql_p/mysql.sock flush-logs
endscript
}
EOF
四.启动logrotate
4.1、分别启动每个日志
[root@mayi ~]# /usr/sbin/logrotate -f /etc/logrotate.d/nginx
[root@mayi ~]# /usr/sbin/logrotate -f /etc/logrotate.d/php_fpm
[root@mayi ~]# /usr/sbin/logrotate -f /etc/logrotate.d/php_slow
[root@mayi ~]# /usr/sbin/logrotate -f /etc/logrotate.d/mysql_slow
4.2、全部启动
[root@mayi ~]# /usr/sbin/logrotate -f /etc/logrotate.conf
4.3、删除默认自动执行切割
[root@mayi ~]# rm -rf /etc/cron.daily/logrotate
文章部分内容通过网络收集整理,如有侵权或技术交流请联系作者!
#Author : mayi
#wchat : a403182580
猜你喜欢
- 2024-10-03 linux下的shell脚本编程介绍 linux shell脚本实例
- 2024-10-03 crontable 切割日志 切割日志文件
- 2024-10-03 Linux:日志轮转 linux日志轮转如何实现
- 2024-10-03 日志切割的方法 日志切割的方法是什么
- 2024-10-03 「Nginx」如何格式化日志并推送到远程服务器?看完原来很简单
- 2024-10-03 Linux下删点日志也能搞死人 linux删除几天前日志文件
- 2024-10-03 Linux日志管理工具Logrotate:自动化轮转与最佳实践
- 2024-10-03 懒人专用2:利用自动脚本切割备份不断增长的日志
- 2024-10-03 Nginx日志管理大揭秘:logrotate工具与配置,日志按日期精准分割
- 2024-10-03 linux中用shell脚本对tomcat和nginx做日志切割
你 发表评论:
欢迎- 最近发表
-
- 我的世界光影MOD下载(我的世界光影mod下载安装)
- 我的世界1.7/1.8VoxelMap小地图MOD下载
- 我的世界1.7.10多世界 整合包(我的世界1.7.10forge整合包)
- 我的世界1.8最好用的修改器下载(我的世界1.8最好用的修改器下载安装)
- 我的世界更多弯曲动作MOD下载(我的世界更多弯曲动作mod下载手机版)
- 我的世界龙珠MOD下载(我的世界龙珠模组整合包下载)
- 我的世界1.7.10以太2 下载(我的世界以太2mod1.12.2)
- 我的世界虚拟人生MOD下载分享(我的世界虚拟人生下载安装)
- 我的世界无正版账号的简单联机方法(非网易版,仅适用于局域网)
- “我的语言极限,即是我的世界的极限。” ——《On Java》书籍推荐
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)