logrotate容器中Nginx⽇志的切割滚动
⽆论是对于系统还是对于应⽤⽽⾔,⽇志是⼀个极其重要的部分,在出现问题需要追踪的时候,⽇志⽂件就发挥它的价值了。
通常⽇志信息会保存在⽂件中,显然随着时间的推移,⽇志⽂件⽂件体积会变成很⼤、记录时间跨度也变得很⼤。
如果需要打开⽇志追溯问题时变得异常困难,所以我们需要对我们的⽇志进⾏管理,通过某种策略对⽇志进⾏分割以降低⽇志⽂件的体积和跨度。
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]
[] <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
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 或 siz e 100M |
logrotate配置⽂件实例
syslog
[root@gop-sg-192-168-56-103 logrotate.d]# cat syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
zabbix-agent
[root@gop-sg-192-168-56-103 logrotate.d]# cat zabbix-agent
/var/log/zabbix/zabbix_agentd.log {
weekly
rotate 12
compress
delaycompress
missingok
notifempty
create 0664 zabbix zabbix
}
nginx
[root@gop-sg-192-168-56-103 logrotate.d]# cat nginx
/var/log/nginx/*.log /var/log/nginx/*/*.log{
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
influxdb
[root@gop-sg-192-168-56-103 logrotate.d]# cat influxdb
/var/log/influxdb/influxd.log {
daily
rotate 7
missingok
dateext
copytruncate
compress
}
关于 USR1 信号解释
USR1 亦通常被⽤来告知应⽤程序重载配置⽂件;例如,向 Apache HTTP 服务器发送⼀个 USR1 信号将导致以下步骤的发⽣:停⽌接受新的连接,等待当前连接停⽌,重新载⼊配置⽂件,重新打开⽇志⽂件,重启服务器,从⽽实现相对平滑的不关机的更改。
对于 USR1 和 2 都可以⽤户⾃定义的,在 POSIX 兼容的平台上,SIGUSR1 和 SIGUSR2 是发送给⼀个进程的信号,它表⽰了⽤户定义的情况。它们的符号常量在头⽂件 signal.h 中定义。在不同的平台上,信号的编号可能发⽣变化,因此需要使⽤符号名称。
kill -HUP pid
killall -HUP pName
其中 pid 是进程标识,pName 是进程的名称。
如果想要更改配置⽽不需停⽌并重新启动服务,可以使⽤上⾯两个命令。在对配置⽂件作必要的更改后,发出该命令以动态更新服务配置。根据约定,当你发送⼀个挂起信号 (信号 1或 HUP) 时,⼤多数服务器进程 (所有常⽤的进程) 都会进⾏复位操作并重新加载它们的配置⽂件。
logrotate⽇志切割轮询
由于 logrotate 是基于 cron 运⾏的,所以这个⽇志轮转的时间是由 cron 控制的,具体可以查询 cron 的配置⽂件 /etc/anacrontab,过往的⽼版本的⽂件为(/etc/crontab)
查看轮转⽂件:/etc/anacrontab
[root@gop-sg-192-168-56-103 logrotate.d]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days  delay in minutes  job-identifier  command
1  5  cron.daily      nice run-parts /etc/cron.daily
7  25  cron.weekly    nice run-parts /etc/cron.weekly
@monthly hly        nice run-parts /hly
使⽤ anacrontab 轮转的配置⽂件,⽇志切割的⽣效时间是在凌晨 3 点到 22 点之间,⽽且随机延迟时间是 45 分钟,但是这样配置⽆法满⾜我们在现实中的应⽤
现在的需求是将切割时间调整到每天的晚上 12 点,即每天切割的⽇志是前⼀天的 0-24 点之间的内容,操作如下:
mv /etc/anacrontab /etc/anacrontab.bak //取消⽇志⾃动轮转的设置
使⽤ crontab 来作为⽇志轮转的触发容器来修改 logrotate 默认执⾏时间
[root@gop-sg-192-168-56-103 logrotate.d]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
59 23 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /hly

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。