博客 / Linux/ nginx按天切割access.log日志存放

nginx按天切割access.log日志存放

nginx按天切割access.log日志存放

Nginx 日志按天切割与归档

为了便于管理和分析,将 Nginx 的访问日志(access.log)按日期进行自动切割和归档是一种常见的运维实践。下面介绍一种基于 Shell 脚本和 Crontab 定时任务的实现方法。

1. 创建日志切割脚本

首先,创建一个 Shell 脚本,例如 /usr/local/nginx/sbin/cut_nginx_log.sh,并赋予其可执行权限。

#!/bin/bash
# 此脚本在每日 00:00 执行

# Nginx 日志存放路径
logs_path="/usr/local/nginx/logs/"

# 创建按年/月组织的目录结构,例如 logs/2024/04/
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/

# 移动并重命名前一天的 access.log 文件
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log

# 向 Nginx 主进程发送 USR1 信号,使其重新打开日志文件
kill -USR1 `cat /usr/local/nginx/nginx.pid`

脚本说明:

  • mkdir -p:递归创建目录,确保目标路径存在。
  • date -d "yesterday":获取前一天的日期,用于目录和文件名。
  • kill -USR1:向 Nginx 主进程发送信号,使其关闭当前日志文件并重新打开一个新的 access.log 文件,实现日志切割的无缝衔接,无需重启 Nginx 服务。

2. 配置定时任务

使用 Crontab 设置每日凌晨执行该脚本。

# 编辑当前用户的 crontab
crontab -e

在打开的编辑器中添加以下一行:

# 每天 00:00 执行日志切割脚本
00 00 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh

保存并退出后,定时任务即会生效。

注意事项与补充说明

  • 路径确认:请根据您的实际安装路径,确认脚本中的 logs_pathnginx.pid 文件路径是否正确。
  • 权限问题:确保运行 Crontab 的用户(通常是 root 或 nginx 运行用户)对 Nginx 日志目录和脚本有读写和执行权限。
  • 日志轮转工具:对于更复杂的日志管理需求(如按大小切割、压缩旧日志、保留期限等),建议使用专业的日志轮转工具,如 logrotate。Linux 系统通常内置了 logrotate,配置更为灵活和强大。
  • 脚本来源:此方法参考了网络上的常见实践。

通过以上步骤,即可实现 Nginx 访问日志的每日自动切割与归档,使日志文件管理更加清晰有序。

发表评论

您的邮箱不会公开。必填项已用 * 标注。