日志实在是太有用了,它记录了程序运行时各种信息。通过日志可以分析用户行为,记录运行轨迹,查找程序问题。可惜磁盘的空间是有限的,就像飞机里的黑匣子,记录的信息再重要也只能记录最后一段时间发生的事。为了节省空间和整理方便,日志文件经常需要按时间或大小等维度分成多份,删除时间久远的日志文件。这就是通常说的日志滚动(log rotation)

Name

logrotate: rotates(回滚)、compresses(压缩)、and mails(邮寄) system logs

Synopsis 概要

logrotate [-dv] [-f|--force] [-s|--state file] config_file ..

Description

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.

Normally, logrotate is run as a daily cron job. It will not modify a log multiple times(多次) in one day unless the criterion[krīˈti(ə)rēən, 标准] for that log is based on the log's size and logrotate is being run multiple times each day, or unless the -f or --force option is used.

Any number of config files may be given on the command line. Later config files may override the options given in earlier files[后来的配置文件可能会覆盖早期文件中给出的选项], so the order in which the logrotate config files are listed is important. Normally, a single config file which includes any other config files which are needed should be used. See below for more information on how to use the include directive to accomplish this. If a directory is given on the command line, every file in that directory is used as a config file.

Options

  • -d, –debug
    Turns on debug mode and implies -v. In debug mode, no changes will be made to the logs or to the logrotate state file. (测试配置文件是否有误,仅调试,不做实际处理)
  • -f, –force 强制转储文件
  • -m, –mail ‘command’ 发送日志到指定邮箱
  • -s, –state ‘statefile’ 使用指定的状态文件
  • -v, –verbose 显示转储过程

Configuration File

logroate 默认安装的文件存储位置说明

1
2
3
4
5
/etc/cron.daily                         # logrotate脚本文件存放位置
/etc/logrotate.conf                     # 主配置文件
/etc/logrotate.d/                       # 特定服务日志存储目录(自己设定的配置文件), 该目录的所有文件都会被主动的读入 /etc/logrotate.conf 中执行
/etc/sbin/logrotate                     # 二进制程序文件
/var/lib/logrotate/logrotate.status     # 状态文件

Note: logrotate 是基于 cron 来运行的,其脚本是 /etc/cron.daily/logrotate, 日志轮转是系统自动完成的。实际运行时,logrotate 会调用配置文件 /etc/logrotate.conf。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ cat /etc/logrotate.conf

# see "man logrotate" for details                                   
# rotate log files weekly                                           
weekly                      # 每周转储一次                                                
                                                                    
# keep 4 weeks worth of backlogs                                    
rotate 4                    # 保留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.   
# 系统特定的日志也可以在主文件中配置。           

以 Nginx 的配置为例对 logroate 的配置文件加以说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}
  • 首先第一行,配置了要自动轮换的日志文件的路径/var/log/nginx/.log,即针对在/var/log/nginx下的.log文件进行轮换
  • 其他参考 logrotate 常用配置参数注解

logrotate 常用配置参数注解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
daily,weekly,monthly    # 转储周期分别是每天/每周/每月;
minsize 15M             # 日志体积大于此值时轮换(例如:100K,4M);
dateext	                # 轮询的文件名字带有日期信息;
missingok               # 如果日志文件丢失,不要显示错误;
rotate 5                # 轮转存储中包含多少备份日志文件,0为无备份,以数字为准; 其他旧的日志文件则删掉(配合daily使用)
compress                # 通过gzip压缩转储以后的日志,以*.gz结尾;
nocompress              # 不需要压缩时,用这个参数;
delaycompress           # 延迟压缩,和compress一起使用时压缩所有日志,除当前和下一个最近的; 延迟压缩任务直到第二次轮换日志才进行,结果会导致你会有当前的日志文件,一个较旧的没有被压缩过的日志文件和一些压缩过的日志文件
compresscmd             # 设置使用什么命令进行压缩,默认gzip
uncompresscmd           # 设置解压的命令,默认gunzip
nodelaycompress         # 覆盖delaycompress选项,转储同时压缩;
copytruncate            # 用于还在打开中的日志文件,把当前日志备份并截断;
nocopytruncate          # 备份日志文件但是不截断;
create 644 www root     # 转储文件,使用指定的文件模式创建新的日志文件;
nocreate                # 不建立新的日志文件;
errors renwole@my.org   # 专储时的错误信息发送到指定的Email地址;
ifempty                 # 即使是空文件也转储,这个是logrotate的缺省选项;
notifempty              # 如果日志文件为空,则不转储;
mail renwole@my.org     # 把转储的日志文件发送到指定的E-mail地;
nomail                  # 转储时不发送日志文件;
olddir /tmp             # 转储后的日志文件放入指定目录,必须和当前日志文件在同一个文件系统;    
noolddir                # 转储后的日志文件和当前日志文件放在同一个目录下;
tabooext                # 不转储指定扩展名的文件,缺省扩展名:cfsaved,.disabled,.dpkg-dist等;  
dateformat              # 配合dateext使用可以为切割后的日志加上YYYYMMDD格式的日期;
prerotate/endscript     # 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行;    
postrotate/endscript    # 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行;    
sharedscripts           # 共享脚本,让postrotate/endscript包含脚本只执行一次即可; 即在所有的日志转换完毕后执行postrotate脚本。如果该项没有设置,则会在每个匹配的日志轮换后执行postrotate脚本。

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

logrotate 机制和原理

logrotate机制和原理

See Also

Thanks to the authors 🙂

返回目录