如何用logrotate管理每日增长的日志

目录
  • logrotate简介
  • 安装logrotate
  • logrotate基本工作原理
  • logrotate的配置和使用
  • 总结

logrotate简介

logrotate is designed to ease administration of systems that generate large numbers of log files. It allows automatic rotation, compression, removal, and mailing of log files. Each log file may be handled daily, weekly, monthly, or when it grows too large.

这是logrotate文档中对其自身的描述,其实logrotate功能很简单,正如其名,按一定周期自动循环分割和保存日志防止无限增长,必要的时候进行压缩、删除,还可以进行邮件通知等功能。

很多服务器上总会运行着一些会不停生成成吨日志的程序,最简单的比如nginx、httpd之类的web服务器的访问日志,为了保持这些日志的可检索以及防止无限增长把有限的硬盘都吃干净了,就会有五花八门的cron脚本来处理这些日志,事实上这些事情都可以由logrotate代劳。

安装logrotate

事实上大多数Linux发行版本都默认安装了logrotate,可以通过以下命令来判断系统是否已经预装了logrotate:

rpm包管理器:

rpm -qa|grep logrotate

dpkg包管理器:

dpkg --list|grep logrotate

更简单粗暴的方法:

which logrotate

如果能看到有字符串返回的话,你的服务器就应该预装了logrotate,并且它已经每天在默默地工作了,只不过你并没有给他分配活儿。

如果没有安装的话,用正常的包管理工具都能安装它:

yum install logrotateapt-get install logrotate

logrotate基本工作原理

作为一个定时处理的管理工具,logrotate本身是个命令行的工具,然而它需要定时处理你的日志,所以显然logrotate还是得基于cron来工作的,否则就没有人定时来唤醒它让它干活了,正常情况下logrotate已经作为cron.daily的一个任务每天被定时在执行了,这个定时脚本位于/etc/cron.daily/logrotate

#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
    [ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

上面这段是Ubuntu中默认的logrotate脚本,各个不同版本上的logrotate脚本会有细微的不同,但是核心都是使用/etc/logrotate.conf配置脚本来启动logrotate。

然而这段脚本只是位于这个目录里,为什么会被每天调用呢,而且每天什么点调用呢?

可以查看CRON的默认配置文件/etc/crontab(新版CentOS中其默认配置文件位于/etc/anacrontab)的内容:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

事实上CRON默认会存在这4条指令,分别是每小时、每天、每周、每个月会执行对应目录下的脚本,而不需要再通过日常常用的crontab去配置,可以看到cron.daily目录下的脚本在每天的6点25分会被执行,这也就意味着在这台机器上每天6点25分会启动logrotate进行日志的处理,各个系统的默认配置也是各不相同的。

最后来看一下默认的配置文件/etc/logrotate.conf:

# see "man logrotate" for details
# rotate log files weekly
weekly
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}
/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}
# system-specific logs may be configured here

其实默认配置文件中给出的是logrotate的一些默认配置选项,并给出了一些样例的配置(如wtmp,btmp),这些配置的意义在后文中会予以阐述,而这个配置文件中还包含了include /etc/logrotate.d,这使得我们可以不用将所有的配置扎堆写入这个默认配置文件中,而是可以分散地管理在/etc/logrotate.d目录下,事实上/etc/logrotate.d也已经包含了一些样例的配置文件供参考。

logrotate的配置和使用

如同刚才所说的,logrotate会每日CRON启动并执行,我们只需要在/etc/logrotate.d目录中添加我们需要的配置,就可以利用logrotate来自动管理我们需要的日志文件。

这里先来看一个目录下已经存在的样例配置dpkg:

/var/log/dpkg.log {
    monthly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
}
/var/log/alternatives.log {
    monthly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
}

正如其名称dpkg,这个配置是用来处理包管理器dpkg的默认日志的,处理的日志文件是/var/log/dpkg.log与/var/log/alternatives.log这两个文件

其配置内容如下:

  • monthly:按月处理日志
  • rotate 12:保留12份日志
  • compress:日志分割后会进行gzip压缩
  • delaycompress:日志压缩会被延后到下次分割时进行
  • missingok:目标日志文件不存在程序也不会报错退出
  • notifempty:目标日志文件为空时不进行分割操作
  • create 644 root root:以644也就是rw-r–r–权限来建立分割出来的文件,同时该分割文件所属用户为root,用户组为root

在/var/log下列出文件列表,可以看到dpkg的日志的确被分割并压缩了:

仿照这个样例文件,我们可以配置一个类似的处理任务,这里处理一下nginx的log文件,一般web serve的access log文件都是日志重灾区,建立一个/etc/logrotate.d/nginx配置文件,内容如下:

/home/wwwlogs/*.log {
    daily
    rotate 7
    dateext
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
    sharedscripts
    postrotate
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    endscript
}

与之前的样例配置类似,注意到声明日志文件位置时使用了*通配符,这意味着/home/wwwlogs/下的所有.log文件都会被logrotate处理,这里多出了几行配置

说明如下:

  • daily:每天处理日志
  • dateext:备份的日志文件的后缀不再是默认的.1 .2 .3的递增格式,而是.YYYYMMDD的日期格式
  • sharedscripts:配置该选项时,prerotate和postrotate段的脚本会在所有文件被处理结束(被处理前)统一执行,而不是每个文件前后分别执行一次
  • postrotate:处理日志后钩子,postrotate和endscript构成一个shell语句块,在日志文件被处理后这部分语句会被执行,对应的还有prerotate语句块

这样nginx的log文件的处理配置就完成了,但是我们可能还需要确认一下配置的内容到底是否正确呢,这时候可以利用logrotate命令行的debug选项来进行测试

命令如下:

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

开启了debug选项时,logrotate会详细地给出处理日志过程中的处理信息,但是并不会真正地去处理日志文件,所以可以用来测试配置文件处理的是否正确

这行命令的输出如下:

reading config file /etc/logrotate.d/nginx
Handling 1 logs
rotating pattern: /home/wwwlogs/*.log  forced from command line (7 rotations)
empty log files are not rotated, old logs are removed
considering log /home/wwwlogs/access.log
  log needs rotating
considering log /home/wwwlogs/jp01.sanaecon.com.log
  log needs rotating
considering log /home/wwwlogs/nginx_error.log
  log needs rotating
rotating log /home/wwwlogs/access.log, log->rotateCount is 7
dateext suffix '-20151108'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
rotating log /home/wwwlogs/jp01.sanaecon.com.log, log->rotateCount is 7
dateext suffix '-20151108'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
rotating log /home/wwwlogs/nginx_error.log, log->rotateCount is 7
dateext suffix '-20151108'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
renaming /home/wwwlogs/access.log to /home/wwwlogs/access.log-20151108
creating new /home/wwwlogs/access.log mode = 0644 uid = 0 gid = 0
renaming /home/wwwlogs/jp01.sanaecon.com.log to /home/wwwlogs/jp01.sanaecon.com.log-20151108
creating new /home/wwwlogs/jp01.sanaecon.com.log mode = 0644 uid = 0 gid = 0
renaming /home/wwwlogs/nginx_error.log to /home/wwwlogs/nginx_error.log-20151108
creating new /home/wwwlogs/nginx_error.log mode = 0644 uid = 0 gid = 0
running postrotate script
running script with arg /home/wwwlogs/*.log : "
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
"

可以看到logrotate如我们设想的那样在正常处理日志文件,至此一个logrotate配置就完成了。

logrotate命令行除了可以用来展示配置文件配置是否正确以外,还可以用来手动执行日志分割,使用以下命令行:

logrotate -f /etc/logrotate.d/nginx

就会脱离CRON手动运行一次日志分割和处理任务,事实上通过这个方式也可以用第三方的其他程序来管理日志分割的频率。

本文中给出了一些常见的配置文件中的配置参数的含义,更多其他的配置参数的含义和功能可以参考官方的配置文档:http://linuxconfig.org/logrotate-8-manual-page

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 在 Linux 系统中手动滚动日志的方法

    日志滚动log rotation在 Linux 系统上是再常见不过的一个功能了,它为系统监控和故障排查保留必要的日志内容,同时又防止过多的日志造成单个日志文件太大. 日志滚动的过程是这样的:在一组日志文件之中,编号最大的(最旧的)一个日志文件会被删除,其余的日志文件编号则依次增大并取代较旧的日志文件,而较新的文件则取代它作为当前的日志文件.这一个过程很容易就可以实现自动化,在细节上还能按需作出微调. 使用 logrotate 命令可以手动执行日志滚动的操作.本文将要介绍的就是手动进行日志滚动的方

  • Linux使用logrotate来切割日志文件

    程序在运行的时候为了了解运行状态,会输出日志文件,时间久了日志文件会变得非常大,甚至达到GB级别.我在golang应用里使用logrus包来打日志,配置和使用都很方便,就是没有日志分割的功能,应用在线上运行一个月后日志文件都已经达到上百兆.后来发现了logrotate,这是centos自带的日志分割工具,都不用安装额外组件就能实现定时分割日志. 1.运行原理 logrotate由系统的cron运行,位置在/etc/cron.daily/logrotate #!/bin/sh /usr/sbin/

  • springAop实现权限管理数据校验操作日志的场景分析

    前言 作为一个写java的使用最多的轻量级框架莫过于spring,不管是老项目用到的springmvc,还是现在流行的springboot,都离不开spring的一些操作,我在面试的时候问的最多的spring的问题就是我们在平常的项目中使用spring最多的有哪几个点 在我看来无非就两个 spring的bean管理,说的高大上一点就是spring的ioc,di spring的AOP spring是一个很强大的轻量级框架,功能远不止这两点,但是我们用的最多的就是这两点. spring bean 管

  • Oracle日常维护中管理用户以及重做日志文件的方法

    一.管理用户和安全性 在db中各种对象以 用户(方案) 的方式组织管理 select distinct object_type from dba_objects; 模式对象,schema ----> user.objects(某个用户下的某个对象) 在创建对象和访问对象前,首先创建对象的拥有者--用户         所有的对象在用户下 用户有相关的属性,有些必须明确设置,有些可以使用默认值         常见属性:用户名.口令.默认表空间(可默认).临时表空间(可默认).账户状态(可默认).

  • Nginx利用Logrotate实现日志分割的详细过程

    目录 前言 Logrotate用法 1.安装 2.基本用法详解 2.1 入门 2.2 分割文件压缩 2.3 按照时间分割 2.4 按照文件大小分割 2.5 自定义每小时分割 2.6 自定义分割执行时间 nginx日志分割步骤 总结 前言 nginx默认没有提供对日志文件的分割功能,所以随着时间的增长,access.log和error.log文件会越来越大,尤其是access.log,其日志记录量比较大,更容易增长文件大小,影响日志写入性能 分割nginx日志的方法有很多,这里推荐利用Logrot

  • Linux中logrotate日志轮询操作总结

    前言 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过!logrotate程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用.可以节省磁盘空间. 下面就对logrotate日志轮转操作做一梳理记录: 1)配置

  • 详解Oracle控制文件及日志文件的管理问题

    目录 一.控制文件的管理 1.控制文件的概述 2.控制文件的创建 1.控制文件的重新建立 3.控制文件的备份 1.将控制文件备份为二进制文件 2.将控制文件备份为文本文件 4.控制文件的恢复 5.添加多路复用的控制文件 二.重做日志文件的管理 1.重做日志文件概述 2.查询重做日志文件信息 3.重做日志文件组及成员的创建 4.重做日志文件组及成员的删除 5.修改重做日志文件的名称或位置 三.归档日志文件的管理 1.归档日志文件概述 2.归档日志信息的查询 3.归档模式的设置 四.总结 一.控制文

  • linux下日志定时轮询的流程详解

    logrotate介绍 对于Linux系统安全来说,日志文件是极其重要的工具.日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到.当日志文件不断增长的时候,就需要定时切割,否则,写日志的速度和性能也会下降,更不便于我们归档,查询. 所以便有了使用logrotate的时候 ,logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循).压缩以及删除旧的日志文件.例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除

  • 详解关于tomcat切割catalina.out日志的三种方式

    1.log4j进行日志切分 1)准备三个包:log4j-1.2.17.jar      tomcat-juli.jar      tomcat-juli-adapters.jar 放到tomcat的lib目录或者是工程的WEB_INF/lib下, 2)在lib目录下新建log4j.properties,加入以下内容 log4j.rootLogger = INFO, CATALINA # Define all the appenders log4j.appender.CATALINA = org.

  • Golang logrus 日志包及日志切割的实现

    本文主要介绍 Golang 中最佳日志解决方案,包括常用日志包logrus的基本使用,如何结合file-rotatelogs包实现日志文件的轮转切割两大话题. Golang 关于日志处理有很多包可以使用,标准库提供的 log 包功能比较少,不支持日志级别的精确控制,自定义添加日志字段等.在众多的日志包中,更推荐使用第三方的 logrus 包,完全兼容自带的 log 包.logrus 是目前 Github 上 star 数量最多的日志库,logrus 功能强大,性能高效,而且具有高度灵活性,提供了

  • MySQL 管理

    对于内容驱动的网站,设计好坏的关键是关系型数据库.在这个教程中,我们已经使用了MySQL关系型数据库管理系统(RDBMS)建立了我们的数据库.对于网站的开发者来说,MySQL是一个较受欢迎的选择,这不仅是因为它对于任何平台上的非商业应用都是免费的,而且也因为它的架设和使用非常的简单.正如我们在第一章中所看到的那样,根据正确的指导,一个新的用户可以在不超过30分钟的时间内架设好一个MySQL服务,并将其运行起来(对于一个有经验的用户甚至只要10分钟!). 如果你想做的仅仅是架设一个MySQL服务环

  • iis 7.5 下站点日志开启以及默认位置设置方法

    在iis6时,通过iis管理器的日志配置可以找到站点日志存储的位置. 但是在iis7下,iis管理器下的日志配置只能找到iis日志配置的主目录,但到底在哪个子目录,则无法直接获知. 先定位到网站 后来在主日志目录下,发现子目录名字比较有规律:W3SVC + 数字,联想到iis的站点配置文件中,每个站点会被分配一个ID,后边的数字应该是对应站点的ID.根据猜想,打开目录中的日志文件查看,得到印证. 站点配置文件通常位于: C:\Windows\System32\inetsrv\config\app

随机推荐

其他