Nginx基础篇06—优化日志

概述

本章,您将学习到对 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 最后读取到的配置项或参数为准。读取顺序为:

  1. 从上到下读取 /etc/logrotate.conf 文件的内容
  2. 使用 "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
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇