前言
我们在Linux服务器上部署服务时,会生成很多日志,如果请求量大的话,日志文件会变得很大,不方便我们定位问题。Linux为我们提供了日志分隔的服务,可用于java、node.js、nginx等服务器的日志分隔及定期清理。
logrotate
- logrotate 是一个 linux 系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间 / 大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。
- logrotate是基于linux定时任务crontab运行的,主流 Linux 发行版上都默认安装有 logrotate 包,如果你的 linux 系统中找不到 logrotate, 可以使用 apt-get 或 yum 命令来安装。
我们可以通过查看logroate的文件来看下其原理
[root@xpqcsyx27128xx8gen ~]# 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
[root@xpqcsyx27128xx8gen ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
cron.xxx是定时执行的任务,有每天执行的,也有每小时执行等。这里以每天执行的文件来看,其主要的内容就是以/etc/logrotate.conf
配置文件来执行logroate
,所以/etc/logrotate.conf
里就是日志分隔的配置,而其中又include了/etc/logroate.d
,所以我们可以将日志分隔的配置放到/etc/logroate.d
中。
配置
在/etc/logroate.d
中默认存放了一些日志的分隔配置,用于系统一些日志的分隔。当我们需要对自己启动的服务进行日志管理时,就需要创建配置文件,然后按照规则来配置日志分隔,下面以自己创建的nginx日志分隔为例,为大家介绍logroate的配置参数:
[root@xpqcsyx27128xx8gen ~]# cd /etc/logrotate.d/
[root@xpqcsyx27128xx8gen logrotate.d]# ls
aide bootlog chrony nginx syslog wpa_supplicant yum
[root@xpqcsyx27128xx8gen logrotate.d]# cat nginx
/app/generalmpl/openresty/nginx/logs/*.log {
daily
rotate 7
missingok
dateext
compress
notifempty
sharedscripts
postrotate
[ -e /app/generalmpl/openresty/nginx/logs/nginx.pid ] && kill -USR1 `cat /app/generalmpl/openresty/nginx/logs/nginx.pid`
endscript
}
/app/generalmpl/openresty/nginx/logs/*.log
代表日志路径,可用*来模糊匹配。
配置项 | 说明 |
daily weekly monthly yearly | 切割周期,多久切割一次。
|
size 10k | 当日志文件到达指定的大小时才转储。 默认单位是 bytes。bytes (缺省) 及 KB (sizek) 或 MB (sizem)。 如: size 10k、 size 10M |
rotate 5 | 日志文件保留备份的个数。默认是 0。 如:0 指没有备份;5 指保留最近的5个备份,其余的全部删除。 |
maxage count | 保留多少天的日志文件。 如:5 指保留最近的5天的日志文件,其余的全部删除。 |
missingok | 在日志轮循期间,错误将被忽略。 例如 “文件无法找到” 之类的错误。 |
copytruncate nocopytruncate |
|
nocompress compress |
|
delaycompress nodelaycompress |
|
prerotate endscript | 在所有其它指令完成 前 执行这两个关键字之间的脚本。这两个关键字必须单独成行 |
postrotate endscript | 在所有其它指令完成 后 执行这两个关键字之间的脚本。这两个关键字必须单独成行 |
sharedscripts | 共享脚本,整个日志组运行一次脚本 。 比如 nginx 涉及到多个日志文件,一般使用 sharedscripts 的作用是在 所有的日志文件 都轮转完毕后 统一执行一次脚本 ; 如果没有 sharedscripts ,那么 每个日志文件 轮转完毕后 都会执行一次脚本 。 |
errors address | 转储时的错误信息发送到指定的 Email 地址。 |
mail address nomail |
|
ifempty notifempty |
|
olddir directory noolddir |
|
dateext | 在日志名称后面,添加日期后缀。默认是当前日期。默认是 -%Y%m%d 的后缀。 可用 如:nginx_access.log --> nginx_access.log-20210120 注意: 格式化日期中不要出现 分号( |
dateformat | 对 dateext 的拓展,必须配合 dateext 使用 在V3.9.0 之前,只支持 在V3.9.0 及之后,支持 如: 注意: 文件名称中禁止出现分号( |
dateyesterday | 与 dateext 配合使用,日期提前一天。 比如,当前日期是2023-03-15,提前一天就是 2021-03-14 |
extension | 与 如: |