nginx 日志切割的三种方法(logrotate切割、shell脚本切割、Python脚本切割)

nginx 日志切割

PS:nginx日志切割可以通过两种方式进行切割,日志logrotate,脚本

方法一:通过logrotate切割

个人感觉配置麻烦,且结合自己这边的项目的环境的复杂,所以就不使用这种方式。这里我也就不写了

可以参考:https://www.cnblogs.com/ilanni/p/5365420.html

方法二:通过shell脚本切割

1、编写shell脚本

#!/bin/bash
#此脚本用于自动分割Nginx的日志,包括access.log和error.log
#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件
#Nginx日志文件所在目录
LOG_PATH=/opt/nginx/logs
#获取昨天的日期
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#获取pid文件路径
PID=/var/run/nginx/nginx.pid
#分割日志
mv ${LOG_PATH}access.log ${LOG_PATH}access-${YESTERDAY}.log
mv ${LOG_PATH}error.log ${LOG_PATH}error-${YESTERDAY}.log
#向Nginx主进程发送USR1信号,重新打开日志文件
kill -USR1 `cat ${PID}`

2、配置crontab每天凌晨00:00定时执行这个脚本

crontab -e
# 输入以下内容并保存
00 00 * * * /bin/bash /opt/nginx/sbin/cut_nginx_log.sh

方法三:通过Python脚本切割

未分类

鉴于这种乱情况,日志目录下面还有多个项目的日志,且分别保存在不同的文件下面(下面又分为测试环境的日志,预发布环境的日志),使用shell脚本就不怎么好写,我就采取了通过Python来实现

脚本:

import os, sys, datetime,re

# nginx日志存放的路径
nginxLogPath="/opt/nginx-1.9.5/logs/"
# 获取昨天的日期
yesterday = (datetime.date.today() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d")
# nginx启动的pid文件
PID = "/var/run/nginx.pid"


def cutNginxLog(path):
    """
    切割nginx日志函数
    :param path: 日志文件的第一级目录
    :return: 
    """
    logList = os.listdir(path)    # 判断传入的path是否是目录
    for logName in logList:      # 循环处理目录里面的文件
        logAbsPath = os.path.join(path, logName)
        if os.path.isdir(logAbsPath):   # 如果是目录,递归调用自己,继续处理
            cutNginxLog(logAbsPath)
        else:         # 如果是日志文件,就进行处理
            # 分割日志
            re_Num = re.compile(r'^[a-zA-Z]')
            # 判断日志文件是否是字母开头,如果是日期开头就不切割
            if re_Num.search(logName):
                logNewName = yesterday + "_" + logName          # 新日志文件名称列如:2018-11-8_access.log
                oldLogPath = os.path.join(path, logName)        # 旧日志文件绝对路径
                newLogPath = os.path.join(path, logNewName)     # 新日志文件绝对路径
                os.rename(oldLogPath, newLogPath)

    cmd = " kill -USR1 `cat %s` "% PID
    res = os.system(cmd)
    if res != 0:
        return "重新加载nginx失败"
cutNginxLog(nginxLogPath)

计划任务:

# crontab -e

30 02 * * * /usr/bin/python3.5 /opt/nginx-1.9.5/sbin/cut_nginx_log.py

切割后的效果图:

未分类

使用Logrotate管理日志

Linux使用某些软件的时候会产生日志文件,而这些软件本身对日志不进行分割或者压缩处理,久而久之会导致日志文件异常巨大,影响机器性能,配置不高的机器上尤为严重。而logrotate就是管理这些日志文件的神器。

Logrotate功能

logrotate会周期性的读,压缩,备份,创建新的日志文件。你想对日志文件做的操作,它基本上可以做到。

  • 防止单个日志文件过于庞大

  • 删除旧的日志文件,以防旧日志文件填满你的磁盘。

  • 对单个日志文件或者某个目录下的文件按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。

许多Linux软件都已经内置了logrotate了,例如httpd默认就使用logrotated来帮你管理日志文件。

未分类

httpd logrotate

Logrotate配置

1.首先看logrotate软件包的内容

未分类

logrotate包目录

一般第三方软件包的日志文件管理都放在/etc/logrotate.d目录下。

httpd

[root@250 nginx]# cat /etc/logrotate.d/httpd/var/log/httpd/*log {
    daily
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

这份配置会处理/var/log/httpd/目录下后缀为log的文件。

  • monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。

  • missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。

  • notifempty: 如果日志文件为空,轮循不会进行。

  • sharedscripts: 在所有的日志文件都轮询之后运行postrotate脚本,如果没设置默认会在每个匹配的文件轮询之后运行一次postrotate脚本。

  • compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。

  • delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。

  • postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。

这里解释仅做参考,logrotate中的每个参数可单独进行搜索,明确具体的含义,man手册中也有详细说明。

排障

logrotate [-dv] [-f|--force] [-s|--state file] config_file
[root@250 nginx]# logrotate --help用法: logrotate [OPTION...] <configfile>
  -d, --debug               Don't do anything, just test (implies -v)
  -f, --force               Force file rotation
  -m, --mail=command        Command to send mail (instead of `/bin/mail')
  -s, --state=statefile     Path of state file
  -v, --verbose             Display messages during rotation
  -l, --log=STRING          Log file
  --version                 Display version information

1.以debug模式运行某个logrotate配置文件

未分类

logrotate debug模式

2.强制使用logrotate近轮询日志文件

未分类

logrotate 强制轮询

3.logrotate记录轮询状态的文件

未分类

logrotate状态文件格式

记录某轮询日志到logrotate状态文件中

logrotate -vf -s /var/lib/logrotate/logrotate.status  /etc/logrotate.d/httpd

最后

logrotate在日志处理上功能十分强大,但却十分容易上手,本文只是作为抛砖引玉的作用。在使用logrotate的时候,根据man手册可查寻找想要了解的各种配置信息。

希望能帮助到大家。

Tomcat 日志切割(logrotate)详细介绍

这篇文章主要介绍了Tomcat 日志切割(logrotate)详细介绍的相关资料,需要的朋友可以参考下

Tomcat 日志切割

logrotate是个强大的系统软件,它对日志文件有着一套完整的操作模式,譬如:转储、邮件和压缩等,并且默认logrotate加到cron(/etc/cron.daily/logrotate)作为每日任务执行。自动有了logrotate,我想不用再自己写日志切割脚本。

如下对Tomcat日志catalina.out日志切割

# ls -lh /usr/local/tomcat/logs/catalina.out
-rw-r--r-- 1 www www 14M Aug 28 15:55 /usr/local/tomcat/logs/catalina.out

配置logrotate对catalina.out日志切割

# cat /etc/logrotate.d/tomcat
/usr/local/tomcat/logs/catalina.out {
daily
rotate 5
missingok
dateext
compress
notifempty
copytruncate
}

参数详解:

  • daily 指定转储周期为每天
  • rotate 5 指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份
  • missingok 如果日志不存在则忽略该警告信息
  • dateext 文件后缀是日期格式,也就是切割后文件是:xxx.log-20150828.gz
  • compress 通过gzip压缩转储以后的日志(gzip -d xxx.gz解压)
  • notifempty 如果是空文件的话,不转储
  • copytruncate 用于还在打开中的日志文件,把当前日志备份并截断

立即截断日志:

# logrotate --force /etc/logrotate.d/tomcat

效果如下:

# ls -lh /usr/local/tomcat/logs/catalina.out*
-rw-r--r-- 1 www www  0 Aug 28 16:00 /usr/local/tomcat/logs/catalina.out
-rw-r--r-- 1 www www 1.1M Aug 28 16:00 /usr/local/tomcat/logs/catalina.out-20150828.gz

如何在Centos 7上用Logrotate管理日志文件

何为Logrotate?

Logrotate是一个实用的日志管理工具,旨在简化对系统上生成大量的日志文件进行管理。 Logrotate允许自动旋转压缩,删除和邮寄日志文件,从而节省宝贵的磁盘空间。 Logrotate可以设置为每天、每周、每月或当日志文件达到一定的大小时处理日志文件。还可以完全控制日志的自动化管理方式,而不需要人工干预。Logrotate支持Linux系统上的所有日志文件,包括但不限于Apache、Nginx、Tomcat、ELK、zabbix等应用。

1. 安装logrotate

系统默认已经安装,某些Linux发行版可能并未安装,那么请执行以下命令安装:

Centos:

$ yum install logrotate -y

Ubuntu:

$ apt-get install logrotate -y

通过yum默认安装的文件存储位置说明

/etc/cron.daily            # logrotate脚本文件存放位置
/etc/logrotate.conf        # 主配置文件
/usr/sbin/logrotate        # 二进制程序文件
/etc/logrotate.d/          # 特定服务日志存储目录(自己设定的配置文件)
/var/lib/logrotate.status  # 状态文件

2. 查看logrotate主文件默认配置情况

$ 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                      # rotate后,创建一个新的空文件

# 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 {             # 指定/var/log/wtmp日志文件;
    monthly                 # 每月轮转一次,优先于全局设定的每周轮转一次;
    minsize 1M              # 日志文件大于1M才会去轮转;
    create 0664 root utmp   # 新日志文件的权限,属主,属组;
    rotate 1                # 保留一个日志备份,优先于全局设置的四个;
}
/var/log/btmp {             # 指定/var/log/btmp日志文件;
    missingok               # 如果日志丢失,不报错;
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.
# 系统特定的日志也可以在主文件中配置。

3. logrotate日志切割

在定义日志文件时可以使用通配符,但不建议使用,因为它会包括已切换过的日志,如必须使用,请在号后加上已知的文件扩展名, 例如:.log。

Nginx日志:

在/etc/logrotate.d/目录下创建Nginx服务日志配置文件

$ vim /etc/logrotate.d/nginx

/usr/local/nginx/logs/*.log {
create 644 www root
daily
dateext
rotate 3
minsize 10K
copytruncate
nocompress
missingok
notifempty
noolddir
postrotate
/bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}

php日志:

/usr/local/php/var/log/*.log {
missingok
notifempty
sharedscripts
delaycompress
create 0664 www www
postrotate
/bin/kill -SIGUSR1 `cat /usr/local/php/var/run/php-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}

注:你也可以手动生成一个20M内容的日志文件进行测试,例如:

$ head -c 20M < /dev/urandom > /var/log/renwole-log

配置完成后,可以通过如下命令来手动执行查看效果:

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

另外还可以使用如下命令查看logrotate运行状态:

$ cat /var/lib/logrotate/logrotate.status

由于Logrotate是基于cron定时运行的,所以logrotate脚本默认在 /etc/cron.daily/ 目录下,文件名是logrotate。你可以设置 /etc/anacrontab 来控制Logrotate何时运行。

4. 查看anacrontab默认配置

$ 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 45     cron.monthly            nice run-parts /etc/cron.monthly

5. 关于logrotate常用配置参数注解

daily,weekly,monthly  # 转储周期分别是每天/每周/每月;
minsize 15M           # 日志体积大于此值时轮换(例如:100K,4M);
dateext               # 轮询的文件名字带有日期信息;
missingok             # 如果日志文件丢失,不要显示错误;
rotate 5              # 轮转存储中包含多少备份日志文件,0为无备份,以数字为准;
compress              # 通过gzip压缩转储以后的日志,以*.gz结尾;
nocompress            # 不需要压缩时,用这个参数;
delaycompress         # 延迟压缩,和compress一起使用时压缩所有日志,除当前和下一个最近的;
nodelaycompress       # 覆盖delaycompress选项,转储同时压缩;
copytruncate          # 用于还在打开中的日志文件,把当前日志备份并截断;
nocopytruncate        # 备份日志文件但是不截断;
create 644 www root   # 转储文件,使用指定的文件模式创建新的日志文件;
nocreate              # 不建立新的日志文件;
errors [email protected] # 专储时的错误信息发送到指定的Email地址;
ifempty               # 即使是空文件也转储,这个是logrotate的缺省选项;
notifempty            # 如果日志文件为空,则不转储;
mail [email protected]   # 把转储的日志文件发送到指定的E-mail地;
nomail                # 转储时不发送日志文件;
olddir /tmp           # 转储后的日志文件放入指定目录,必须和当前日志文件在同一个文件系统;
noolddir              # 转储后的日志文件和当前日志文件放在同一个目录下;
prerotate/endscript   # 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行;
postrotate/endscript  # 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行;
tabooext              # 不转储指定扩展名的文件,缺省扩展名:cfsaved,.disabled,.dpkg-dist等;
sharedscripts         # 共享脚本,让postrotate/endscript包含脚本只执行一次即可;
dateformat            # 配合dateext使用可以为切割后的日志加上YYYYMMDD格式的日期;

以上参数都可以在全局主配置文件中定义,或指定为某个日志文件进行配置,注意:使用时参数之间不要冲突。

Logrotate的常见配置

缩小日志大小和备份文件用

如果想测试配置文件

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

下面是nginx php和mysql的日志设置

/var/log/nginx/*.log {
        daily
        size 1G
        missingok
        rotate 10
        compress
        delaycompress
        notifempty
        create 0640 nobody nobody
        sharedscripts
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then 
                        run-parts /etc/logrotate.d/httpd-prerotate; 
                fi 
        endscript
        postrotate
                [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
        endscript
}


/usr/local/php/var/log/php-fpm.log /usr/local/php/var/log/php-fpm.log.slow {
    dateext
    create
    #maxage 90
    rotate 60
    missingok
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /var/run/php-fpm.pid`
    endscript
}

/var/lib/mysql/slow-log /var/lib/mysql/localhost.err {
    dateext
    create
    # notifempty
    #maxage 90
    rotate 60
    missingok
    sharedscripts
    postrotate
        /usr/local/mysql/bin/mysqladmin -uroot -p'password' flush-logs
    endscript
}

logrotate日志分割工具使用介绍

一、logrotate简介

logrotate是一个日志文件管理工具。用来把旧文件轮转、压缩、删除,并且创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小、天数等来转储,便于对日志文件管理,一般都是通过cron计划任务来完成的,并且可以发送日志到指定的E-mail。

The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files. Logrotate allows for the automatic rotation compression, removal and mailing of log files. Logrotate can be set to handle a log file daily, weekly, monthly or when the log file gets to a certain size.

二、logrotate安装及配置详解

1、logrotate安装

在Debian或Ubuntu上:

# apt-get install logrotate cron
在Fedora,CentOS或RHEL上:
# yum install logrotate crontabs

2、logrotate配置

logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。

logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:

未分类

三、logrotate示例

1、logrotate配置语法

logrotate.conf中的配置语法很简单:
日志文件名的绝对路径(如果有多个用空格隔开) {
    需要配置的参数
}

命令参数说明
# logrotate --help

Usage: logrotate [OPTION...] <configfile>
  -d, --debug               调试模式,输出调试结果,并不执行。隐式-v参数
  -f, --force               强制模式,对所有相关文件进行rotate
  -m, --mail=command        发送邮件 (instead of `/bin/mail')
  -s, --state=statefile     状态文件,对于运行在不同用户情况下有用
  -v, --verbose             显示debug信息

2、logrotate应用示例

/var/log/nginx/*.log /var/log/tomcat/*log {   # 可以指定多个路径
    daily                      # 日志轮询周期,weekly,monthly,yearly
    rotate 30                  # 保存30天数据,超过的则删除
    size +100M                 # 超过100M时分割,单位K,M,G,优先级高于daily
    compress                   # 切割后压缩,也可以为nocompress
    delaycompress              # 切割时对上次的日志文件进行压缩
    dateext                    # 日志文件切割时添加日期后缀
    missingok                  # 如果没有日志文件也不报错
    notifempty                 # 日志为空时不进行切换,默认为ifempty
    create 640 nginx nginx     # 使用该模式创建日志文件
    sharedscripts              # 所有的文件切割之后只执行一次下面脚本
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

当配置完成后,可以通过如下方式进行测试。

—– 可直接手动执行

$ logrotate --force /etc/logrotate.d/nginx

—– 显示详细的信息;而且–debug/-d实际上不会操作具体文件(Dry Run)

$ logrotate --debug --verbose --force /etc/logrotate.d/nginx

在 CentOS 中,默认会将日志保存 /var/lib/logrotate.status 文件中,如果需要指定到其它文件,可以通过 -s/–state
参数指定。

/var/log/messages {
    rotate 5
    weekly
    postrotate
        /sbin/killall -HUP syslogd
    endscript
}

"/var/log/httpd/access.log" /var/log/httpd/error.log {
    rotate 5
    mail [email protected]
    size 100k
    sharedscripts
    postrotate
        /sbin/killall -HUP httpd
    endscript
}

/var/log/news/* {
    monthly
    rotate 2
    olddir /var/log/news/old
    missingok
    postrotate
        kill -HUP ‘cat /var/run/inn.pid‘
    endscript
    nocompress
}

Linux的logrotate日志轮询原理介绍

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

1. 配置文件介绍

Linux系统默认安装logrotate工具,它默认的配置文件在:

/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。
另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。

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

[root@huanqiu_web1 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf &gt;/dev/null 2&gt;&amp;1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要

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

logrotate命令格式:

logrotate [OPTION...] 
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。

根据日志切割设置进行操作,并显示详细信息

[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.conf 
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.d/php

根据日志切割设置进行执行,并显示详细信息,但是不进行具体操作,debug模式

[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.conf 
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx

查看各log文件的具体执行情况

[root@fangfull_web1 ~]# cat /var/lib/logrotate.status

2. 切割介绍

比如以系统日志/var/log/message做切割来简单说明下:
第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;
第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!
如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。
日志究竟轮换几次,这个是根据配置文件中的dateext 参数来判定的。

看下logrotate.conf配置:

# cat /etc/logrotate.conf
# 底下的设定是 "logrotate 的默认值" ,如果別的文件设定了其他的值,
# 就会以其它文件的设定为主
weekly          //默认每一周执行一次rotate轮转工作
rotate 4       //保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0 指没有备份
create         //自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext       //这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
compress      //是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行

include /etc/logrotate.d
# 将 /etc/logrotate.d/ 目录中的所有文件都加载进来

/var/log/wtmp {                 //仅针对 /var/log/wtmp 所设定的参数
monthly                    //每月一次切割,取代默认的一周
minsize 1M              //文件大小超过 1M 后才会切割
create 0664 root utmp            //指定新建的日志文件权限以及所属用户和组
rotate 1                    //只保留一个日志.
}
# 这个 wtmp 可记录用户登录系统及系统重启的时间
# 因为有 minsize 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。

由这个文件的设定可以知道/etc/logrotate.d其实就是由/etc/logrotate.conf 所规划出来的目录,虽然可以将所有的配置都写入/etc/logrotate.conf ,但是这样一来这个文件就实在是太复杂了,尤其是当使用很多的服务在系统上面时, 每个服务都要去修改/etc/logrotate.conf的设定也似乎不太合理了。
所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中

其他重要参数说明:

  • 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

小示例:下面一个切割nginx日志的配置

[root@master-server ~]# vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
daily
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate
    if [ -f /usr/local/nginx/logs/nginx.pid ]; then
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    fi
endscript
}

分享一例曾经使用过的nginx日志切割处理脚本

2.1 logrotate日志分割配置:

[root@bastion-IDC ~# vim /etc/logrotate.d/nginx
/data/nginx_logs/*.access_log        
{
nocompress                                   
daily                                  
copytruncate                                  
create                              
ifempty                                   
olddir /data/nginx_logs/days           
rotate 0                                        
}

2.2 日志分割脚本

[root@bastion-IDC ~# vim /usr/local/sbin/logrotate-nginx.sh
#!/bin/bash
#创建转储日志压缩存放目录
mkdir -p /data/nginx_logs/days
#手工对nginx日志进行切割转换
/usr/sbin/logrotate -vf /etc/logrotate.d/nginx
#当前时间
time=$(date -d "yesterday" +"%Y-%m-%d")
#进入转储日志存放目录
cd /data/nginx_logs/days
#对目录中的转储日志文件的文件名进行统一转换
for i in $(ls ./ | grep "^(.*).[[:digit:]]$")
do
mv ${i} ./$(echo ${i}|sed -n 's/^(.*).([[:digit:]])$/1/p')-$(echo $time)
done
#对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间
for i in $(ls ./ | grep "^(.*)-([[:digit:]-]+)$")
do
tar jcvf ${i}.bz2 ./${i}
rm -rf ./${i}
done
#只保留最近7天的压缩转储日志文件
find /data/nginx_logs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} ;

2.3 crontab定时执行

[root@bastion-IDC ~# crontab -e
#logrotate
0 0 * * * /bin/bash -x /usr/local/sbin/logrotate-nginx.sh &gt; /dev/null 2&gt;&amp;1

手动执行脚本,测试下看看:

[root@bastion-IDC ~# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh
[root@bastion-IDC ~# cd /data/nginx_logs/days
[root@bastion-IDC days# ls
huantest.access_log-2017-01-18.bz2

php脚本

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/php
/Data/logs/php/*log {
    daily
    rotate 365
    missingok
    notifempty
    compress
    dateext
    sharedscripts
    postrotate
        if [ -f /Data/app/php5.6.26/var/run/php-fpm.pid ]; then
            kill -USR1 `cat /Data/app/php5.6.26/var/run/php-fpm.pid`
        fi
    endscript
    postrotate
        /bin/chmod 644 /Data/logs/php/*gz
    endscript
}

[root@huanqiu_web1 ~]# ll /Data/app/php5.6.26/var/run/php-fpm.pid
-rw-r--r-- 1 root root 4 Dec 28 17:03 /Data/app/php5.6.26/var/run/php-fpm.pid

[root@huanqiu_web1 ~]# cd /Data/logs/php
[root@huanqiu_web1 php]# ll
total 25676
-rw-r--r-- 1 root   root         0 Jun  1  2016 error.log
-rw-r--r-- 1 nobody nobody     182 Aug 30  2015 error.log-20150830.gz
-rw-r--r-- 1 nobody nobody     371 Sep  1  2015 error.log-20150901.gz
-rw-r--r-- 1 nobody nobody     315 Sep  7  2015 error.log-20150907.gz
.........
.........

nginx日志

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/nginx
/Data/logs/nginx/*/*log {
    daily
    rotate 365
    missingok
    notifempty
    compress
    dateext
    sharedscripts
    postrotate
    /etc/init.d/nginx reload
    endscript
}

[root@huanqiu_web1 ~]# ll /Data/logs/nginx/www.huanqiu.com/
..........
-rw-r--r-- 1 root root      1652 Jan  1 00:00 error.log-20170101.gz
-rw-r--r-- 1 root root      1289 Jan  2 00:00 error.log-20170102.gz
-rw-r--r-- 1 root root      1633 Jan  3 00:00 error.log-20170103.gz
-rw-r--r-- 1 root root      3239 Jan  4 00:00 error.log-20170104.gz

系统日志

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2&gt; /dev/null` 2&gt; /dev/null || true
    endscript
}

[root@huanqiu_web1 ~]# ll /var/log/messages*
-rw------- 1 root root 34248975 Jan 19 18:42 /var/log/messages
-rw------- 1 root root 51772994 Dec 25 03:11 /var/log/messages-20161225
-rw------- 1 root root 51800210 Jan  1 03:05 /var/log/messages-20170101
-rw------- 1 root root 51981366 Jan  8 03:36 /var/log/messages-20170108
-rw------- 1 root root 51843025 Jan 15 03:40 /var/log/messages-20170115
[root@huanqiu_web1 ~]# ll /var/log/cron*
-rw------- 1 root root 2155681 Jan 19 18:43 /var/log/cron
-rw------- 1 root root 2932618 Dec 25 03:11 /var/log/cron-20161225
-rw------- 1 root root 2939305 Jan  1 03:06 /var/log/cron-20170101
-rw------- 1 root root 2951820 Jan  8 03:37 /var/log/cron-20170108
-rw------- 1 root root 3203992 Jan 15 03:41 /var/log/cron-20170115
[root@huanqiu_web1 ~]# ll /var/log/secure*
-rw------- 1 root root  275343 Jan 19 18:36 /var/log/secure
-rw------- 1 root root 2111936 Dec 25 03:06 /var/log/secure-20161225
-rw------- 1 root root 2772744 Jan  1 02:57 /var/log/secure-20170101
-rw------- 1 root root 1115543 Jan  8 03:26 /var/log/secure-20170108
-rw------- 1 root root  731599 Jan 15 03:40 /var/log/secure-20170115
[root@huanqiu_web1 ~]# ll /var/log/spooler*
-rw------- 1 root root 0 Jan 15 03:41 /var/log/spooler
-rw------- 1 root root 0 Dec 18 03:21 /var/log/spooler-20161225
-rw------- 1 root root 0 Dec 25 03:11 /var/log/spooler-20170101
-rw------- 1 root root 0 Jan  1 03:06 /var/log/spooler-20170108
-rw------- 1 root root 0 Jan  8 03:37 /var/log/spooler-20170115

tomcat日志

[root@huanqiu-backup ~]# cat /etc/logrotate.d/tomcat
/Data/app/tomcat-7-huanqiu/logs/catalina.out {
rotate 14
daily
copytruncate
compress
notifempty
missingok
}

[root@huanqiu-backup ~]# ll /Data/app/tomcat-7-huanqiu/logs/catalina.*
-rw-r--r--. 1 root root     0 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out
-rw-r--r--. 1 root root 95668 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out.1.gz

早期用过的nginx日志

[root@letv-backup ~]# vim /letv/sh/cut_nginx_log.sh
#!/bin/bash
# 你的日志文件存放目录
logs_path="/letv/logs/"
# 日志文件的名字,多个需要空格隔开
logs_names=(error access pv_access)
dates=`date -d "yesterday" +"%Y%m%d"`
mkdir -p ${logs_path}$dates/
num=${#logs_names[@]}
for((i=0;i /dev/null 2&gt;$1

3. 尝试解决logrotate无法自动轮询日志的办法

现象说明:
使用logrotate轮询nginx日志,配置好之后,发现nginx日志连续两天没被切割,这是为什么呢??
然后开始检查日志切割的配置文件是否有问题,检查后确定配置文件一切正常。
于是怀疑是logrotate预定的cron没执行,查看了cron的日志,发现有一条Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)这样的日志,证明cron在04:02分时已经执行/etc/cron.daily目录下的程序。
接着查看/etc /cron.daily/logrotate(这是logrotate自动轮转的脚本)的内容:

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf &gt;/dev/null 2&gt;&amp;1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

没有发现异常,配置好的日志轮转操作都是由这个脚本完成的,一切运行正常,脚本应该就没问题。
直接执行命令:

[root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf

这些系统日志是正常轮询了,但nginx日志却还是没轮询

接着强行启动记录文件维护操作,纵使logrotate指令认为没有需要,应该有可能是logroate认为nginx日志太小,不进行轮询。
故需要强制轮询,即在/etc/cron.daily/logrotate脚本中将 -t 参数替换成 -f 参数

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf &gt;/dev/null 2&gt;&amp;1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

最后最后重启下cron服务:

[root@huanqiu_test ~]# /etc/init.d/crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]

logrotate的日志每天切割都是默认在凌晨3点进行,现在需要将切割时间调整到每天的晚上12点,即每天切割的日志是前一天的0-24点之间的内容。
按照下面的方法几乎做到了安全按照每天来清晰的分隔日志:

1. 去掉了/etc/cron.daily/logrotate 
2. 直接crontab -e
#log logrotate
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx &gt;/dev/null 2&gt;&amp;1
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/tomcat &gt;/dev/null 2&gt;&amp;1
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/syslog &gt;/dev/null 2&gt;&amp;1

logrotate无法自动轮询日志的原因

上次介绍使用logrotate轮询nginx日志的方法。配置好之后,连续两天都没发现logrotate轮询nginx的日志,于是开始检查配置文件是否有问题,结果是配置文件一切正常。怀疑是cron没执行,查看了cron的日志,发现有一条Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)这样的日志,证明cron在04:02分时已经执行/etc/cron.daily目录下的程序。接着查看/etc/cron.daily/logrotate的内容:

  1. #!/bin/sh
  2.  
  3. /usr/sbin/logrotate /etc/logrotate.conf
  4. EXITVALUE=$?
  5. if [ $EXITVALUE != 0 ]; then
  6.     /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
  7. fi
  8. exit 0

没有发现异常,系统日志等都是由这个脚本轮询的,一切运行正常,脚本应该就没问题。直接执行命令/usr/sbin/logrotate /etc/logrotate.conf系统日志是正常轮询了,但nginx日志却没反应。
再man logrotate看下说明发现一个选项-f (–force),大概意思是:强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。
那应该有可能是logroate认为nginx日志太小,不进行轮询,但我们需要轮询,加-f选项即可。即

  1. /usr/sbin/logrotate -f /etc/logrotate.conf

不清楚logrotate轮询的条件是什么,还要强制轮询才行,搞不懂。

使用logrotate轮询nginx和apache日志

使用logrotate轮询日志很方便,配置也很简单。

配置nginx

1、建立/etc/logrotate.d/nginx文件

  1. vi /etc/logrotate.d/nginx

2、写入如下内容:

  1. /var/log/nginx/*log {
  2.     daily
  3.     rotate 10
  4.     missingok
  5.     notifempty
  6.     compress
  7.     sharedscripts
  8.     postrotate
  9.         [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
  10.     endscript
  11. }

注释:
/var/log/nginx/*log:需要轮询日志路径
daily:每天轮询
rotate 10:保留最多10次滚动的日志
missingok:如果日志丢失,不报错继续滚动下一个日志
notifempty:当日志为空时不进行滚动
compress:旧日志默认用gzip压缩
/var/run/nginx.pid:nginx主进程pid

配置apache

  1. /var/log/httpd/*log {
  2.     missingok
  3.     notifempty
  4.     sharedscripts
  5.     postrotate
  6.         /sbin/service httpd reload > /dev/null 2>/dev/null || true
  7.     endscript
  8. }