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_path和nginx.pid文件路径是否正确。 - 权限问题:确保运行 Crontab 的用户(通常是 root 或 nginx 运行用户)对 Nginx 日志目录和脚本有读写和执行权限。
- 日志轮转工具:对于更复杂的日志管理需求(如按大小切割、压缩旧日志、保留期限等),建议使用专业的日志轮转工具,如
logrotate。Linux 系统通常内置了logrotate,配置更为灵活和强大。 - 脚本来源:此方法参考了网络上的常见实践。
通过以上步骤,即可实现 Nginx 访问日志的每日自动切割与归档,使日志文件管理更加清晰有序。
Pingback: nginx做静态文件下载服务器之安装与配置-老牛博客