### Linux使用logrotate来切割日志文件
#### 一、引言
在现代软件系统中,日志记录是一项至关重要的任务。它可以帮助开发者追踪错误、监控应用程序的状态,并为后续的性能优化提供数据支持。然而,随着时间的推移,日志文件会逐渐增大,导致磁盘空间不足或系统性能下降等问题。因此,对日志文件进行管理和维护显得尤为重要。在Linux环境中,一个广泛使用的工具——`logrotate`,能够有效地解决这一问题。
#### 二、logrotate运行原理
`logrotate`是一个用于管理日志文件生命周期的强大工具。它由系统的`cron`服务定期调用来完成日志轮转(即切割)任务。通常情况下,`logrotate`会在每天的某个固定时间被`cron`服务触发执行。
在系统中,`logrotate`的执行脚本位于`/etc/cron.daily/logrotate`目录下。该脚本的核心内容如下:
```bash
#!/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
```
上述脚本中的关键部分是`/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf`这条命令。它指定了`logrotate`的工作配置文件`/etc/logrotate.conf`,并利用`-s`选项来指定状态文件`/var/lib/logrotate/logrotate.status`的位置,该文件用于记录上次日志轮转的时间以及轮转的状态信息等,从而确保日志文件能够按照预期的方式进行切割。
如果发现`logrotate`没有按照预期执行,请检查系统的`crond`服务是否正常启动。
#### 三、logrotate配置详解
`logrotate`的配置文件位于`/etc/logrotate.conf`,其中包含了各种日志轮转策略的配置。此外,还可以在`/etc/logrotate.d`目录下创建额外的配置文件来满足特定需求。
以下是一个示例配置:
```bash
/var/log/nginx/*log {
create 0644 nginx nginx
daily
rotate 10
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid` 2>/dev/null || true
endscript
}
```
1. **定义日志文件路径**:第一行定义了日志文件的路径。这里使用通配符`*log`来匹配所有以`.log`结尾的日志文件。可以通过指定多个文件路径并用空格分隔来指定多个日志文件。
2. **常用配置参数**:
- `create`:设置新日志文件的权限。
- `daily`、`weekly`、`monthly`:分别表示按天、周、月进行轮转。
- `rotate`:指定要保留的历史日志文件数量。例如,`rotate 10`表示保留最近10份备份。
- `missingok`:如果指定的日志文件不存在,则忽略该情况,不会报错。
- `notifempty`:即使日志文件为空,也会进行轮转。
- `compress`:启用GZIP压缩。
- `sharedscripts`:确保脚本只执行一次。
- `postrotate`/`endscript`:指定日志文件轮转后执行的命令。
#### 四、示例解析
接下来,我们将通过两个具体的示例来进一步理解`logrotate`的配置方式:
##### 示例一
```bash
/var/log/httpd/error.log {
rotate 5
mail root@localhost
size 100k
sharedscripts
postrotate
/sbin/killall -HUP httpd
endscript
}
```
此配置表示:
- 当`/var/log/httpd/error.log`文件大小超过100KB时,`logrotate`将对其进行切割。
- 保留最近5份备份。
- 日志文件被切割后,通过`/sbin/killall -HUP httpd`命令通知httpd重新加载配置文件,从而确保httpd能够读取新的日志文件。
##### 示例二
```bash
/var/lib/mysql/mysqld.log {
create 600 mysql mysql
notifempty
daily
rotate 3
missingok
compress
postrotate
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin ping &> /dev/null; then
/usr/bin/mysqladmin --local flush-error-log \
flush-engine-log flush-general-log flush-slow-log
fi
endscript
}
```
此配置表示:
- 创建新日志文件时,其权限设置为600,所有者和组均为`mysql`。
- 按天进行轮转。
- 保留最近3份备份。
- 日志文件被切割后,如果`mysqladmin`命令可用并且MySQL服务正在运行,则执行一系列的flush命令来清空日志缓冲区。
#### 五、总结
通过以上介绍,我们了解到`logrotate`是一个非常强大的工具,它不仅可以帮助我们管理日益增长的日志文件,还能够通过灵活的配置实现各种高级功能。无论是对于开发人员还是运维工程师而言,掌握`logrotate`的使用方法都是非常必要的。希望本文能对你理解和使用`logrotate`有所帮助。