Logrorate日志切割与备份,主机日志、Nginx日志备份

概述

因部分日志需要根据日志保留规范保留指定时间日志信息,例如主机日志留存时间不得少于6个月。
在某些场景下,日志没有自动切分的情况,日志文件会越来越大,查看很不方便,在合理的时间里进行日志切割也非常有必要。本文主要介绍利用logrorate进行日志切割和日志备份。以主机日志和Nginx日志为例说明具体使用方法和注意事项。

Logrotate简介

logrotate 程序是一个日志文件管理工具。它提供自动替换,压缩,删除和邮寄记录文件,每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。使用者必须自行编辑,指定配置文件,预设的配置文件存放在/etc目录下,文件名称为logrotate.conf

语法

logrotate [-?dfv][-s <状态文件>][--usage][配置文件]

️参数说明:

  • -?--help  在线帮助。
  • -d--debug  详细显示指令执行过程,便于排错或了解程序执行的情况。
  • -f--force  强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。
  • -s<状态文件>或--state=<状态文件>  使用指定的状态文件。
  • -v--version  显示指令执行过程。
  • -usage  显示指令基本用法。

示例:

# 强制执行,会真正执行
/usr/sbin/logrotate -f /etc/logrotate.d/nginx
# 调试执行,不会真生成文件,会打印执行过程
/usr/sbin/logrotate -df /etc/logrotate.d/nginx
# 手动运行
logrotate /etc/logrotate.conf

配置文件格式:

日志文件路径 {
 # 具体配置
}

# 示例
/usr/local/nginx/logs/*.log {
  copytruncate
  daily
  rotate 180
  dateext
  missingok
  compress
  delaycompress
}

尽管花括号的开头可以和其他文本放在同一行上,但是结尾的花括号必须单独成行。

参数说明

配置参数 说明
monthly 日志文件将按月轮循。其它可用值为dailyweekly或者yearly
rotate 5 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
compress 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
delaycompress 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
missingok 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
notifempty 如果日志文件为空,轮循不会进行。
ifempty 默认值,即使是空文件也转储,这个是 logrotate 的缺省选项。【可以设置为该值】
create 644 root root 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
copytruncate 把原始文件拷贝一份,然后重命名,然后把原始文件清空。用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断,新输入的日志文件在备份的文件中
dateext 使用日期作为日志轮替文件的后缀
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件,默认只有create没有细化到具体权限
nocreate 不建立新的日志文件
errors address 专储时的错误信息发送到指定的Email 地址
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts 对每个转储日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如/var/log/news/*.example)。 如果指定此项sharedscripts,则无论有多少个日志与通配符模式匹配,脚本都只会运行一次
nosharedscripts 针对每一个转储的日志文件,都执行一次prerotate 和 postrotate脚本,此为默认值
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size Size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

原理

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

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

logrotate.conf 是主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。
如果/etc/logrotate.d/ 里面的文件中没有设置某些值,则会以/etc/logrotate.conf这个文件的设定的值作为默认值;如果/etc/logrotate.d/中的文件设置了,那么文件的优先级高。
Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的,每天执行一次
Logrorate日志切割与备份,主机日志、Nginx日志备份_第1张图片

默认配置说明

/etc/logrotate.conf

# see "man logrotate" for details
# rotate log files weekly
# 默认按周轮换
weekly

# keep 4 weeks worth of backlogs
# 默认保留4周的日志备份
rotate 4

# create new (empty) log files after rotating old ones
# 创建新的文件
create

# use date as a suffix of the rotated file
# 以时间格式为后缀命名 access.log-yyyyMMdd
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 {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

/etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

注意:

  • logrorate脚本默认在/etc/cron.daily路径下,默认每天执行一次,具体执行时间说法不一,实际观察执行时间在凌晨3点左右,如果这个时间不满足实际需求,可执行编写cron即可

调整Linux主机日志保留时间

linux系统中/var/log/目录日志默认保存四周并不生成系统日志(syslog.log),当用户有规定保存多少天时才去进行修改。系统日志路径/var/log/目录下

logrotate是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志文件,这个过程称为“转储”。
调整/etc/logrotate.conf中的weekly为指定时间即可。例如半年,将默认的4改为26即可

# keep 4 weeks worth of backlogs
rotate 26

因为/etc/logrotate.d/syslog中做了详细的配置,我们只需要指定时间即可。

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

调整Nginx日志保留时间

具体配置

/etc/logrorate.d/目录下添加nginxlog配置

# 添加nginxlog配置文件,文件名自定义即可
vim /etc/logrorate.d/nginxlog
# 加入以下配置【推荐】
/usr/local/nginx/logs/*.log {
  daily
  rotate 180
  dateext
  missingok
  compress
  delaycompress
  postrotate
    if [ -f /usr/local/nginx/logs/nginx.pid ]; then
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid 2> /dev/null` 2> /dev/null || true
    fi
  endscript
}

配置说明

# 不推荐配置
/usr/local/nginx/logs/*.log {  # 日志路径
  copytruncate # 以复制的方式备份文件,会截断正在输入的内容,但是会在备份时产生两倍的空间,磁盘空间小的情况下不建议使用。
  daily # 按天执行
  rotate 180 # 保留180个
  dateext # 以时间格式为后缀
  missingok # 文件缺失不报错
  compress # 打包
  delaycompress # 延迟打包
}
# 推荐配置
/usr/local/nginx/logs/*.log {  # 日志路径
  daily # 按天执行
  rotate 180 # 保留180个
  dateext # 以时间格式为后缀
  missingok # 文件缺失不报错
  compress # 打包
  delaycompress # 延迟打包
  postrotate  # 后执行脚本,nginx.pid根据真实路径写
    if [ -f /usr/local/nginx/logs/nginx.pid ]; then
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid 2> /dev/null` 2> /dev/null || true  # 刷新日志配置文件
    fi
  endscript
}

对于第一种不推荐的配置:如果不添加copytruncate,那么日志不会被截断,还是会输入到新的已经备份的文件中。加了copytruncate,会有复制动作,备份时会占用很大磁盘空间。
第二种配置使用了后置脚本,重新刷新了日志文件,也不会出现第一种占用空间的情况。

Logrorate日志切割与备份,主机日志、Nginx日志备份_第2张图片
脚本都是自动自行的,配置完可以手动执行一次,命令如下

# 调试执行,不会真生成文件,会打印执行过程
/usr/sbin/logrotate -df /etc/logrotate.d/nginx

kill -USR1 和kii -HUP的作用

kill -USR1:
通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
kill -HUP pid 或者 killall -HUP pName:
其中pid是进程标识,pName是进程的名称
如果想要更改配置而不需停止并重新启动服务,可以使用上面两个命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。
根据约定,当你发送一个挂起信号(信号1或HUP)时,大多数服务器进程(所有常用的进程)都会进行复位操作并重新加载它们的配置文件。

参考资料

  1. Linux logrotate命令 | 菜鸟教程
  2. Tomcat日志catalina.out过大问题_绿毛水怪ttb的博客-CSDN博客_tomcat的catalina太大
  3. logrotate 的使用简介_冻梨不是梨的博客-CSDN博客_logrotate
  4. Linux 日志切割神器 Logrotate 原理和配置详解_Biu_diudiu的博客-CSDN博客
  5. 日志切割之Logrotate - 惨绿少年 - 博客园

你可能感兴趣的:(日志监控,常用工具与脚本,服务器,linux,运维)