无论是对于系统还是对于应用而言,日志是一个极其重要的部分,在出现问题需要追踪的时候,日志文件就发挥它的价值了。
通常日志信息会保存在文件中,显然随着时间的推移,日志文件文件体积会变成很大、记录时间跨度也变得很大。
如果需要打开日志追溯问题时变得异常困难,所以我们需要对我们的日志进行管理,通过某种策略对日志进行分割以降低日志文件的体积和跨度。
logrotate就是这样的一个工具。
对于系统日志而言,并没有做这样的策略。对于应用而已,我们会要求开发者将日志写入到以时间命令的日志文件中。
一个日志文件保存一天时间的日志,这是一种比较方便快捷的方式。
我们一般在容器中的nginx日志会通过卷的方式挂载在宿主机上,日志也会随着时间推移变的越来越大。
我们将在宿主机上进行日志切割容器中的nginx日志。
logrotate命令 linux系统默认安装了logrotate的工具。
# docker exec web logrotate -v
logrotate 3.7.4 - Copyright (C) 1995-2001 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License
Usage: logrotate [-dfv?] [-d|--debug] [-f|--force] [-m|--mail command]
[-s|--state statefile] [-v|--verbose] [-?|--help] [--usage]
[OPTION...] <configfile>
我们在容器里面定义的切割规则为:
# cat /etc/logrotate.d/nginx
/data/logs/*.log { #表示nginx日志存储路径
daily #指定转储周期为每天
rotate 5 #指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
missingok #如果日志丢失,不报错继续滚动下一个日志
notifempty #当日志文件为空时,不进行轮转
sharedscripts #运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。
#如果没有配置这个,那么每个日志轮转后都会执行一次脚本
dateext #使用当期日期作为命名格式
postrotate #在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
if [ -f /opt/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /opt/nginx/logs/nginx.pid`
fi
endscript #postrotate结束标识符
}
然后在容器里面定义切割脚本:
[root@容器 ~]# cat log.sh
#!/bin/bash
/usr/sbin/logrotate -f /etc/logrotate.d/nginx
然后在宿主机定义crontab定时任务:
# m h dom mon dow command
1 0 * * * sh /root/cron/log.sh
root@宿主机:~# cat ~/cron/log.sh
#!/bin/bash
docker exec web "/root/log.sh"
这样就完成了容器中nginx日志的切割滚动!
logrotate配置文件参数
配置 | 说明 |
---|---|
compress | 通过gzip 压缩转储以后的日志 |
nocompress | 不做gzip压缩处理 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 |
nocopytruncate | 备份日志文件不过不截断 |
create mode owner group | 轮转时指定创建新文件的属性,如create 0777 nobody nobody |
nocreate | 不建立新的日志文件 |
delaycompress | 和compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩。 |
missingok | 如果日志丢失,不报错继续滚动下一个日志 |
errors address | 专储时的错误信息发送到指定的Email 地址 |
ifempty | 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。 |
notifempty | 当日志文件为空时,不进行轮转 |
mail address | 把转储的日志文件发送到指定的E-mail 地址 |
nomail | 转储时不发送日志文件 |
olddir directory | 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
sharedscripts | 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 |
prerotate | 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 |
postrotate | 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 |
daily | 指定转储周期为每天 |
weekly | 指定转储周期为每周 |
monthly | 指定转储周期为每月 |
rotate count | 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 |
dateext | 使用当期日期作为命名格式 |
dateformat .%s | 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 |
size(或minsize) log-size | 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)size = 5 或 size 5 (>= 5 个字节就转储)size = 100k 或 size 100k size = 100M 或 size 100M |