使用logrotate分割日志

logrotate介绍

在开发过程中我们经常需要查看日志文件,来排查线上的问题。如果日志文件过大, 则打开会比较慢,这个时候就需要进行日志分割。logrotate是linux上的一个日志分割工具,可以很方便的进行日志分割。

logrotate的安装与配置

安装logrotate

主流的linux发行版都默认安装有logrotate, 如果没有的话,可以通过如下方式安装(日志分割常使用定时任务):

Debian或Ubuntu下: apt-get install logrotate cron

Fedora、CentOS或RHEL下: yum install logrotate crontabs

配置logrotate

在ubuntu上,logrotate安装完成的配置文件是/etc/logrotate.conf, 我们使用vim打开配置文件,可以看到类似如下的配置, 我们可以看到有include /etc/logrotate.d这行, 这是用来加载/etc/logrotate.d下的所有配置,我们一般是在/etc/logrotate.d下建立单独的文件,用来针对不同的日志文件,进行不同的分割配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mpress

# 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
}

配置文件示例

比方说,我想对nginx日志进行分割,我的nginx日志位于/opt/nginx/logs/access.log,下面是配置的步骤

  • 在/etc/logrotate.d/目录中建立一个nginx文件

    1
    sudo touch nginx
  • 使用vim编辑nginx文件,第一行是日志文件的位置(使用通配符可以针对目录下所有的日志进行分割),大括号里是一些配置的参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /opt/nginx/logs/access.log # /opt/nginx/logs/*.log 这样可对logs下所有的日志进行分割
    {
    size 20M #当日志超过20M后分割
    create 640 root root # 分割创建的日志文件的权限与所有者
    missingok # 忽略运行logrotate时找不到文件错误
    notifempty # 如果日志文件为空,则不会分割日志
    nocompress # 不对日志文件进行压缩,如果想要压缩,则设置成compress
    rotate 7 # 除当天的外,保留7天的日志
    daily # 日志文件以天进行分割 (这个和size选择一个设置)
    dateext # 以日期命名
    copytruncate # 先拷贝原有日志,再清空原有日志
    postrotate
    [ -f /opt/nginx/logs/nginx.pid ] && kill -USR1 `cat /opt/nginx/logs/nginx.pid`
    endscript # 这段脚本在分割之后执行,重启nginx,重新加载日志文件,防止不写
    }
  • 手动运行logrotate命令, -vf参数, -v 是执行时打印执行信息,-f是强制执行

    1
    2
    logrotate -vf  /etc/logrotate.d/nginx #针对单个的logrotate配置运行指令
    logrotate -vf /etc/logrotate.conf #这样会运行所有的logrotate配置

自动运行logrotate指令

我们在线上一般会使用定时任务来运行logrotate指令,例如每天执行一次logrotate,步骤如下(定时任务一般系统都会自带,如果没有,按照文章开头说的方式安装):

  • 打开定时任务

    1
    crontab -e
  • 编辑定时任务

    1
    2
    0 1 * * * logrotate -vf /etc/logrotate.conf # 每天1点执行分割任务,所有的任务
    0 1 * * * logrotate -vf /etc/logrotate.d/nginx #指定执行某个分割任务
  • 开启定时任务

    1
    sudo service cron  start
  • 查看定时任务

    1
    crontab -l