简介
logrotate 是一个用于管理日志文件的工具。它可以自动对日志文件进行轮转、压缩、删除等操作,以防止日志文件无限增长占用过多磁盘空间。logrotate 通常作为一个守护进程定期运行,也可以通过 cron 任务来调度执行
工作原理
- 按照配置文件中的规则,定期检查要管理的日志文件。
- 如果满足轮转条件(例如达到指定的时间间隔、文件大小等),logrotate 会执行以下操作:
- 复制当前日志文件(如果使用了
copytruncate
参数,则是先复制再清空原文件)。 - 重命名复制后的文件,添加轮转编号。
- 根据配置对旧日志文件进行压缩(如果配置了
compress
参数)。 - 删除超过保留数量的旧日志文件。
- 复制当前日志文件(如果使用了
- 完成日志文件的轮转操作后,logrotate 会更新相关的状态信息,以便下次运行时能够正确判断日志文件的状态。
相关信息
命令参数
copytruncate
:用于在切割日志文件时,先复制日志文件内容,然后清空原日志文件,而不是移动原日志文件。这样可以保证在切割日志文件时,应用程序仍然可以向原日志文件写入日志。compress
:对轮转后的旧日志文件进行压缩,通常使用 gzip 压缩格式。daily
/weekly
/monthly
:指定日志文件的轮转频率,可以是每天、每周或每月。rotate
:指定保留的日志文件轮转数量。例如,rotate 5
表示保留最近的 5 个轮转后的日志文件。size
:根据日志文件的大小进行轮转。例如,size 100k
表示当日志文件达到 100KB 时进行轮转。
配置目录:/etc/logrotate.conf
独立配置目录:/etc/logrotate.d/xxx
查看版本信息:
logrotate --version
logrotate 的主配置文件通常是 /etc/logrotate.conf
。此外,还可以在 /etc/logrotate.d/
目录下创建单独的配置文件,每个配置文件对应一个要管理的日志文件或一组日志文件
1. 手动执行 logrotate
可以直接运行 logrotate 命令来执行默认配置文件 /etc/logrotate.conf。如果要执行特定的配置文件,可以这样:logrotate /path/to/custom.conf
2. 查看 logrotate 状态
使用 logrotate -d [配置文件路径] 可以进行模拟执行,即显示如果执行 logrotate 会发生的操作,但不会实际修改日志文件。这对于检查配置文件的正确性很有用
3. 强制执行 logrotate
logrotate -f [配置文件路径] 可以强制进行日志轮转,即使日志文件没有满足通常的轮转条件
4. 输出详细信息
logrotate -v [配置文件路径] 会输出详细的执行过程信息,帮助你了解 logrotate 具体在做什么
以mylog 为例
# 查看模拟执行效果
logrotate -d /etc/logrotate.d/mylog
# 强制执行日志轮转
logrotate -f /etc/logrotate.d/mylog
# 以详细模式执行
logrotate -v /etc/logrotate.d/mylog
应用示例
场景:以openresty 中的nginx 日志为例 进行切割
切换到 /etc/logrotate.d 目录下
创建 openresty_nginx 文件(文件名随意) 并进行如下的配置
相关命令
#切换到配置目录
cd /etc/logrotate.d
#创建新的配置文件
touch openresty_nginx
#编辑文件
vi openresty_nginx
openresty_nginx 文件内容添加如下的配置信息
/usr/local/openresty/nginx/logs/*.log {
su root root
daily
rotate 7
missingok
notifempty
compress
delaycompress
postrotate
if [ -f /usr/local/openresty/nginx/logs/nginx.pid ]; then
systemctl restart openresty.service
fi
endscript
}
手动 启动一次 验证配置是否正确
logrotate -vf /etc/logrotate.conf
完结撒花!!!
问题
rotating pattern: /usr/local/openresty/nginx/logs/*.log forced from command line (7 rotations)
empty log files are not rotated, old logs are removed
considering log /usr/local/openresty/nginx/logs/access.log
error: skipping "/usr/local/openresty/nginx/logs/access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
原因:日志文件(xxxlog)的父文件夹有“w”的组权限,通常只用所属组为root 才会出现这个错误
解决方案:
方法一:去掉对应日志父目录的“w”组权限 ---- g-w
方法二:在对应的logrotate配置文件中添加“su <dir_user> <dir_group>”
su root root (第一root 文件夹所属用户名,第二个root文件夹所属用户组)