一.概述

logrotate是一个Linux系统默认安装了的日志文件管理工具,用来把旧文件轮转、压缩、删除,并且创建新的日志文件。我们可以根据日志文件的大小、天数等来转储,便于对日志文件管理。

logrotate是基于crond服务来运行的,其crond服务的脚本是/etc/cron.daily/logrotate,日志转储是系统自动完成的。实际运行时,logrotate会调用配置文件 /etc/logrotate.conf,可以在 /etc/logrotate.d 目录里放置自定义好的配置文件,用来覆盖logrotate的缺省值。


二.配置文件详解

/etc/logrotate.conf 是主配置文件

/etc/logrotate.d 是一个目录,该目录下的所有文件都会被主动的读到 /etc/logrotate.conf 中执行

配置项说明:

配置项 说明
compress 通过 gzip 压缩转储旧的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断,是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据
nocopytruncate 备份日志文件但是不截断
create mode owner group 使用指定的文件模式创建新的日志文件,如:create 0664 root utmp
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩
missingok 在日志转储期间,任何错误将被忽略
errors address 转储时的错误信息发送到指定的 Email 地址
ifempty 即使日志文件是空文件也转储,这个是 logrotate 的缺省选项
notifempty 如果日志文件是空文件的话,不转储
mail E-mail 把转储的日志文件发送到指定的 E-mail 地址
nomail 转储时不发送日志文件到 E-mail 地址
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储之前需要执行的命令可以放入这个对中,这两个关键字必须单独成行
postrotate/endscript 在转储之后需要执行的命令可以放入这个对中,这两个关键字必须单独成行
sharedscripts 所有的日志文件都转储完毕后统一执行一次脚本
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5个备份
size(minsize) logsize 当日志文件到达指定的大小时才转储,size 可以指定单位为k或M,如:size 500k,size 100M
dateext 指定转储后的日志文件以当前日期为格式结尾,如
dateformat dateformat 配合dateext使用,紧跟在下一行出现,定义日期格式,只支持%Y %m %d %s这4个参数,如:dateformat -%Y%m%d%s

三.实战案例

1.nginx

cat > /etc/logrotate.d/nginx << eof
/usr/local/nginx/logs/*log {
daily
# 每天转储
rotate 30
# 保存30个备份
missingok
# 在日志转储期间,任何错误将被忽略
notifempty
# 文件为空时不转储
compress
# 通过 gzip 压缩
dateext
# 日志文件以当前日期为格式结尾
sharedscripts
# 所有日志文件转储完毕后执行一次脚本
postrotate
# 转储之后执行命令,和endscript成对使用
/bin/kill -USR1 \$(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || :
endscript
# 转储之后执行命令,和postrotate成对使用
}
eof

2.rsyslog

cat > /etc/logrotate.d/syslog << eof
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
dateext
rotate 25
size 40M
compress
dateformat -%Y%m%d%s
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
eof

3.redis

cat > /etc/logrotate.d/redis << eof
/var/log/redis/*.log {
weekly
rotate 10
copytruncate
delaycompress
compress
notifempty
missingok
}
eof

4.supervisor

cat > /etc/logrotate.d/supervisor << eof
/var/log/supervisor/*.log {
missingok
weekly
notifempty
nocompress
}
eof

5.yum

cat > /etc/logrotate.d/yum << eof
/var/log/yum.log {
missingok
notifempty
yearly
create 0600 root root
}
eof

6.httpd

cat > /etc/logrotate.d/httpd << eof
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
eof

7.salt

cat > /etc/logrotate.d/salt << eof
/var/log/salt/master {
weekly
missingok
rotate 5
compress
notifempty
} /var/log/salt/minion {
weekly
missingok
rotate 5
compress
notifempty
} /var/log/salt/key {
weekly
missingok
rotate 5
compress
notifempty
} /var/log/salt/cloud {
weekly
missingok
rotate 5
compress
notifempty
} /var/log/salt/ssh {
weekly
missingok
rotate 5
compress
notifempty
}
eof

四.命令参数说明

使用 man logrotate 或者 logrotate --help 来查看相关命令参数

logrotate --help
Usage: logrotate [OPTION...] <configfile>
-d, --debug 调试模式,输出调试结果,并不执行。隐式-v参数
-f, --force 强制转储文件
-m, --mail=command 发送邮件命令而不是用‘/bin/mail'发
-s, --state=statefile 状态文件,对于运行在不同用户情况下有用
-v, --verbose 显示转储过程的详细信息

如果等不及cron自动执行日志转储,可以强制转储文件(-f 参数) ,正式执行前最好使用调试模式(-d 参数)

/usr/sbin/logrotate -f /etc/logrotate.d/nginx
/usr/sbin/logrotate -d -f /etc/logrotate.d/nginx

五.自定义日志转储时间

现在需要将日志转储(切割)时间调整到每天的0点,即每天切割的日志是前一天的0点-23点59分59秒之间的内容。

1.日志转储流程

首先说一下基于crond服务,logrotate转储日志的流程:

crond服务加载/etc/cron.d/0hourly --->在每小时的01分执行/etc/cron.hourly/0anacron --->执行anacron --->根据/etc/anacrontab的配置执行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly --->执行/etc/cron.daily/下的logrotate脚本 --->执行logrotate --->根据/etc/logrotate.conf配置执行脚本/etc/logrotate.d/nginx --->转储nginx日志成功

重点看一下 /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 # 随机的延迟时间,表示最大45分钟
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22 # 在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 45 cron.monthly nice run-parts /etc/cron.monthly
# period in days 是表示1天、7天、1个月执行一次
# delay in minutes 是延迟的分钟数
# nice设置优先级为10,范围为-20(最高优先级)到19(最低优先级)
# run-parts 是一个脚本,表示会执行它后面目录里的脚本

分析可以得出,如果机器没有关机,默认的logrotate(配置文件里设置的是daily)一般会在每天的3点05分到3点45分之间执行。

2.定义每天00点00分转储nginx日志

方法一

通过上面的分析,调整如下:

调整 /etc/anacrontab 配置文件,将 RANDOM_DELAY=0 , START_HOURS_RANGE=0-22 , delay in minutes 改为0。

调整 /etc/cron.d/0hourly 配置文件,将01改为00(/etc/cron.daily那一行)。

这样logrotate就可以在每天00点00分转储日志(配置文件里设置的是daily)

方法二

上面的方法会影响到 /etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly 下所有脚本的自动执行时间,影响范围有点大,如果我们仅仅需要nginx的日志转储在每天00点执行怎么办?

我们可以创建一个文件夹,如 /etc/logrotate.daily.0/ ,放置每天0点需要执行的转储日志配置,然后设置计划任务,每天00点00分 logrotate -f 强制执行。具体操作如下:

mkdir -p /etc/logrotate.daily.0/
mv /etc/logrotate.d/nginx /etc/logrotate.daily.0/ # 具体配置内容参照上文
crontab -e
#nginx log logrotate
00 00 * * * /usr/sbin/logrotate -f /etc/logrotate.daily.0/nginx >/dev/null 2>&1

注意:/etc/logrotate.d/目录下相应的配置文件要删掉,否则每天会自动执行两次。


六.参考资料

运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)

crontab和anacron和logrotate的关系详解

logrotate日志管理工具的更多相关文章

  1. logrotate日志管理工具与split文件切割命令

    概述 logrotate是一个Linux系统默认安装了的日志文件管理工具,用来把旧文件轮转.压缩.删除,并且创建新的日志文件.我们可以根据日志文件的大小.天数等来转储,便于对日志文件管理. logro ...

  2. 【运维工具】logrotate 日志管理神器

    服务器经常会产生各种各样的日志文件,我们需要定期清理 日志的分类 系统日志 应用日志 系统日志 例如系统的history 历史信息   crontab的运行日志  一般系统日志系统都帮我们运维好了,不 ...

  3. 日志管理工具之logrotate

    Logrotate配置和测试 logrotate软件是一个日志管理工具,用于非分隔日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间.logrotate是基于cron ...

  4. 系统自带的日志管理工具-rsyslogd

    系统自带的日志管理工具-rsyslogd 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志管理简介 1.什么是日志 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以 ...

  5. Java程序员须知的七个日志管理工具(转)

    Splunk vs. Sumo Logic vs. LogStash vs. GrayLog vs. Loggly vs. PaperTrails vs. Splunk>Storm 英文原文:T ...

  6. LogCook 一个简单实用的Android日志管理工具

    众所周知,日志的管理是软件系统很重要的一部分,千万不可忽略其重要性.完整的日志将会在系统维护中起着异常重要的作用,就好像磨刀不误砍柴工一样,日志就像对系统进行分析的工具,工具便捷了,对系统分析起来就能 ...

  7. mysql 开发进阶篇系列 33 工具篇(mysqlbinlog日志管理工具)

    一.概述 由于服务器生成的二进制日志文件以二进制格式保存,所以如果要想检查这些文件的文本格式,就会用到mysqlbinlog日志管理工具. mysqlbinlog的语法如下: mysqlbinlog ...

  8. Java程序员须知的七个日志管理工具

    本文由 ImportNew - 赖 信涛 翻译自 takipiblog.欢迎加入翻译小组.转载请见文末要求. Splunk vs. Sumo Logic vs. LogStash vs. GrayLo ...

  9. web项目中日志管理工具的使用

    在web项目中,很多时候会用到日志管理工具,常见的日志管理用具有:JDK logging(配置文件:logging.properties) 和log4j(配置文件:log4j.properties) ...

随机推荐

  1. sqlite3获取所有表信息

     SELECT * FROM sqlite_master

  2. WIN下Git GUI 教程

    现在很多都有git来托管项目或者来查找资料,但是看起来操作不是很方便,现在由于win下可以直接使用git gui,让使用git变得方便,当然这只是针对日常简单的使用,如果想详细的使用,可以去参考廖学峰 ...

  3. 【Zookeeper】源码分析之请求处理链(三)之SyncRequestProcessor

    一.前言 在分析了PrepRequestProcessor处理器后,接着来分析SyncRequestProcessor,该处理器将请求存入磁盘,其将请求批量的存入磁盘以提高效率,请求在写入磁盘之前是不 ...

  4. HTML:Hyper Text Markup Language 超文本标记语言

    1.HTML是什么? *Hyper Text Markup Language 超文本标记语言 *Hyper Text:超链接.把不同空间的资源,整合在一起,形成逻辑上的网状结构. *Markup La ...

  5. ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题

    转载请注明原文地址: ReactNative的fetch是天然的异步请求,因此,如果你在一个代码块中使用了fetch,那么在执行的时候程序不会等待网络响应结束才执行下一条代码,而是会直接按顺序执行完整 ...

  6. 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)

    开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...

  7. MySQL参数化查询的IN 和 LIKE

    https://stackoverflow.com/questions/650455/c-sharp-parameterized-query-mysql-with-in-clausehttps://s ...

  8. V-rep学习笔记:机器人模型创建3—搭建动力学模型

    接着之前写的V-rep学习笔记:机器人模型创建2—添加关节继续机器人创建流程.如果已经添加好关节,那么就可以进入流程的最后一步:搭建层次结构模型和模型定义(build the model hierar ...

  9. 在Listener(监听器)定时启动的TimerTask(定时任务)中使用Spring@Service注解的bean

    1.有时候在项目中需要定时启动某个任务,对于这个需求,基于JavaEE规范,我们可以使用Listener与TimerTask来实现,代码如下: public class TestTaskListene ...

  10. android软键盘弹出引起的各种不适终极解决方案

    android软键盘弹出引起的各种不适终极解决方案 以下描述如何解决ListView高度小于0时出现的UI问题. 创建RelativeLayout的子类TxrjRelativeLayout publi ...