概述
本章,您将学习到对 Nginx 的日志进行优化。
如同源码编译安装的 Apache httpd 一样,源码编译安装的 Nginx 同样需要进行日志优化工作。
如果将 Nginx 的日志全部记录在单个文件当中,随着时间的推移,日志文件所占有的存储空间会越来越大而且查询起来也很不方便,因此需要对日志文件进行处理,这里的处理指的是轮替(切割和删除)。
- 切割 - 将日志按照特定的规则分隔成一个又一个小文件,比如以天为单位切割大日志文件、以文件大小为单位切割大日志文件
- 删除 - 保留一定时间内的文件但删除该时间之前的日志,比如保留最近一个月内的日志,但删除最近一个月之前的日志
- 轮替 - 指切割与删除的统称
与日志轮替相关的命令
生产环境下,通常都会使用 logrotate 命令完成日志轮替工作。提到 logrotate 命令,需要先介绍 /etc/logrotate.conf 文件和 /etc/logrotate.d/ 目录。
Shell > grep -v -E "^#|^$" /etc/logrotate.conf
weekly
rotate 4
create
dateext
include /etc/logrotate.d
Shell > ls -l /etc/logrotate.d/
-rw-r--r-- 1 root root 130 Feb 7 2023 btmp
-rw-r--r--. 1 root root 160 Dec 5 2023 chrony
-rw-r--r--. 1 root root 88 Apr 12 2021 dnf
-rw-r--r-- 1 root root 93 Mar 11 17:29 firewalld
-rw-r--r--. 1 root root 162 Apr 16 19:49 kvm_stat
-rw-r--r-- 1 root root 289 Dec 18 01:38 sssd
-rw-r--r-- 1 root root 226 Nov 5 15:43 syslog
-rw-r--r-- 1 root root 145 Feb 19 2018 wtmp
/etc/logrotate.conf - 日志轮替的全局配置文件。如果配置项或参数重叠,则以 logrotate 最后读取到的配置项或参数为准。读取顺序为:
- 从上到下读取 /etc/logrotate.conf 文件的内容
- 使用 "include" 关键字包含的文件
常见的配置项或参数为:
| 项 | 说明 |
|---|---|
daily |
定义以天为单位的日志轮替周期 |
weekly |
定义以周为单位的日志轮替周期 |
monthly |
定义以月为单位的日志轮替周期 |
rotate <NUMBER> |
日志轮替后保存的文件数 |
compress |
在日志轮替后压缩旧日志 |
create <MODE> <OWNER> <GROUP> |
日志轮替后,定义新日志文件的权限、所有者以及所属组 |
mail <E-MAIL ADDRESS> |
日志轮替后,将输出的内容以邮件的方式发送到指定的邮箱 |
missingok |
如果日志文件不存在,则忽略日志的警告信息 |
notifempty |
如果日志文件的内容为空,则不会发生日志轮替 |
minsize <SIZE> |
日志轮替的文件大小条件,即日志轮替仅在满足此条件时发生 |
dateext |
使用日期作为日志轮替的文件后缀名 |
Nginx 所有的日志文件都存放在 /usr/local/nginx/logs/ 目录中,日志轮替的配置如下:
Shell > vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
daily
rotate 30
create 0640 nginx nginx
missingok
notifempty
dateext
sharedscripts
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -s 10 $(cat /usr/local/nginx/logs/nginx.pid)
fi
endscript
}
对于 if ... fi 这部分,其属于 Bash 编程中的流程控制,其语法为:
if [条件判断式]; then
程序
fi
-f File是指判断对应的普通文件是否存在,若为真,则执行相关的程序或命令$(cat /usr/local/nginx/logs/nginx.pid)- 获取 Nginx 主进程 ID 号-
kill -s 10 $(cat /usr/local/nginx/logs/nginx.pid)- 对主进程发送 10 信号,Nginx 主进程会执行以下操作:- 将当前关联的日志(如访问日志 access.log 和错误日志 error.log)重命名为备份文件
- 关闭旧日志的文件描述符并创建新的、同名的日志文件
- 将后续的请求日志写入到新日志文件中
需要注意的是,Nginx 官方文档 明确定义了 10 信号的功能 —— 重新打开日志文件。这也解释了为什么使用 killall 命令优雅停止 Nginx 时必须使用 3 信号,因为官方文档明确定义了这些信号的功能。
强制执行一次轮替:
Shell > logrotate -f /etc/logrotate.conf
查看轮替后的文件信息:
Shell > ls -l /usr/local/nginx/logs/
total 8
-rw-r----- 1 nginx nginx 0 Aug 26 20:26 access.log
-rw-r--r-- 1 root root 414 Aug 26 19:50 access.log-20260826
-rw-r----- 1 nginx nginx 0 Aug 26 20:26 error.log
-rw-r--r-- 1 root root 705 Aug 26 20:17 error.log-20260826
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论










