生产环境如何配置 Nginx 日志切割按天归档并保留 30 天的脚本写法

文章导读
生产环境配置 Nginx 日志按天归档并保留 30 天,主要有两种主流方案。推荐使用系统自带的 logrotate 工具,通过配置/etc/logrotate.d/nginx 文件,设置 daily 参数按天切割,rotate 30 保留 30 份,并配合 postrotate 脚本发送 USR1 信号通知 Nginx 重新打开日志。另一种方法是编写 Shell 脚本配合 crontab 定时任务
📋 目录
  1. nginx 按天分割日志
  2. 分割 Nginx 的 access.log 日志并保留 30 天一个月时长,自动删除多余的日志
  3. Nginx 日志切割:按日期管理日志文件,提升运维效率
  4. 【详解】Nginx 日志按日期分割的实现
  5. nginx 设置定时切割日志
  6. FAQ
A A

生产环境配置 Nginx 日志按天归档并保留 30 天,主要有两种主流方案。推荐使用系统自带的 logrotate 工具,通过配置/etc/logrotate.d/nginx 文件,设置 daily 参数按天切割,rotate 30 保留 30 份,并配合 postrotate 脚本发送 USR1 信号通知 Nginx 重新打开日志。另一种方法是编写 Shell 脚本配合 crontab 定时任务,手动 mv 日志文件并按日期命名,同时使用 find 命令删除 30 天前的旧文件。两种方案均能有效防止磁盘空间爆满,便于日志管理与分析。

nginx 按天分割日志

Nginx 本身不支持按天自动切分日志,需要通过外部工具实现。最常用的方法是 logrotate(linux 系统自带日志轮转工具),也可以使用 cron 脚本配合 nginx -s reopen 实现。方法一:使用 logrotate(推荐) 大多数 Linux 发行版安装 Nginx 后会自动创建/etc/logrotate.d/nginx 配置文件,默认按天轮转。(如果没有需手动创建该文件) 1. 检查现有配置 cat/etc/logrotate.d/nginx 2. 典型配置示例 # *.log 日志路径和 nginx.pid 文件路径根据自己的实际情况配置/usr/local/nginx/logs/*.log{daily# 按天轮转 missingok# 日志不存在时不报错 rotate30# 保留 30 天 dateext# 启用日期后缀 compress# 压缩旧日志 delaycompress# 延迟压缩 (保留最近一个未压缩) notifempty# 空文件不轮转 create 0640 nginx adm sharedscripts postrotate# 重新打开日志文件,注意信号是 USR1 或 reopen[-f/usr/local/nginx/logs/nginx.pid]&&kill-USR1`cat/usr/local/nginx/logs/nginx.pid`endscript} postrotate / endscript 含义:定义一个在日志轮转之后执行的脚本块。postrotate 开始,endscript 结束。脚本可以是任何 Shell 命令。sharedscripts 含义:指示 logrotate 对所有匹配的日志文件只执行一次 postrotate 中的脚本,而不是为每个日志文件单独执行一次。

分割 Nginx 的 access.log 日志并保留 30 天一个月时长,自动删除多余的日志

分割 Nginx 的 access.log 日志并保留 30 天一个月时长,自动删除多余的日志 1、创建存放日志文件夹 mkdir /data/nginx\_logs/ 2、创建分割日志脚本 vim /usr/local/nginx/sbin/cut\_nginx\_logs.sh 3、输入文件内容 保存日志目录为:/data/nginx_logs/ log_files_from 为 nginx.conf 配置的原始日志文件路径 log_files_to 为新存放的日志文件路径 #!/bin/bash #function:cut nginx log files log_files_from="/usr/local/nginx/logs/" log_files_to="/data/nginx_logs/" log_name="access" backupEndTime=`date +%Y-%m-%d@%Hh%Mm%Ss` file=${log_files_from}${log_name}.log if [ -f "$file" ];then mv ${log_files_from}${log_name}.log ${log_files_to}${log_name}_${backupEndTime}.log #delete 30 days ago nginx log files cd $log_files_torm rm -rf `find . -name '*.log' -mtime +30` #restart nginx systemctl restart nginx fi

Nginx 日志切割:按日期管理日志文件,提升运维效率

1. 日志切割 目的 将 Nginx 的访问日志和错误日志按日期切割,避免日志文件过大,方便管理和分析。操作步骤 创建日志切割脚本:在/usr/local/nginx/sbin/下创建一个日志切割脚本:vim/usr/local/nginx/sbin/cut_nginx_log.sh 添加以下内容:#!/bin/bashlog_path="/usr/local/nginx/logs"today=$(date-d"yesterday"+"%Y-%m-%d")# 切割访问日志 mv $log_path/access.log $log_path/access_$today.log # 切割错误日志 mv $log_path/error.log $log_path/error_$today.log # 通知 Nginx 重新生成日志文件 kill-USR1$(cat/usr/local/nginx/logs/nginx.pid) 赋予执行权限:chmod+x/usr/local/nginx/sbin/cut_nginx_log.sh 设置定时任务:使用 crontab 配置每天凌晨切割日志:crontab-e 添加以下内容:00***/usr/local/nginx/sbin/cut_nginx_log.sh 测试步骤 手动执行脚本:/usr/local/nginx/sbin/cut_nginx_log.sh 检查日志目录:ls/usr/local/nginx/logs/ 预期输出:日志目录中应出现 access_<日期>.log 和 error_<日期>.log 文件。总结 通过为 Nginx 设置日志切割脚本并配置定时任务,我们可以轻松实现日志的自动管理,避免日志文件过大带来的麻烦。这个方案简单高效,适合日常运维工作。

【详解】Nginx 日志按日期分割的实现

1. Nginx 日志基本配置 首先,我们需要了解 Nginx 的基本日志配置。在 Nginx 的配置文件 (通常位于/etc/nginx/nginx.conf 或/etc/nginx/conf.d/ 目录下的某个文件中),可以通过 access_log 指令指定访问日志的路径和格式。例如:这个配置指定了一个名为 main 的日志格式,并设置所有请求的访问日志记录到/var/log/nginx/access.log 文件中。2. 使用 logrotate 进行日志分割 虽然 Nginx 本身不直接支持日志文件的自动按日期分割,但可以通过外部工具 logrotate 来实现这一功能。logrotate 是一个强大的日志管理工具,可以定期对日志文件进行轮转、压缩、删除等操作。2.1 安装 logrotate 大多数 Linux 发行版默认已经安装了 logrotate。如果没有安装,可以通过包管理器安装:Debian/Ubuntu: CentOS/RHEL: 2.2 配置 logrotate logrotate 的配置文件通常位于/etc/logrotate.conf,每个服务也可以有自己的配置文件,通常放在/etc/logrotate.d/ 目录下。为了配置 Nginx 日志的自动轮转,可以在/etc/logrotate.d/ 目录下创建一个名为 nginx 的文件,内容如下:2.3 配置项解释 daily: 每天轮转一次日志。rotate 30: 保留最近 30 天的日志文件。compress: 压缩轮转后的日志文件。delaycompress: 延迟压缩,即在下一次轮转时才压缩上一次的文件。missingok: 如果日志文件不存在,不会报错。notifempty: 如果日志文件为空,则不进行轮转。

nginx 设置定时切割日志

这将对/var/log/nginx 目录下所有以.log 结尾的文件进行日志切割。具体的配置说明如下:daily:每天切割日志 missingok:如果日志文件不存在,则不发出警告 rotate 7:保留最近 7 个日志文件 compress:使用 gzip 压缩旧日志文件 delaycompress:在下一次轮换时压缩旧日志文件 notifempty:如果日志文件为空,则不进行轮换 create 0640 www-data adm:创建新日志文件,并设置文件权限 sharedscripts:在执行 postrotate 脚本之前,运行所有的 prerotate 脚本 postrotate:在日志文件轮换后,重新加载 nginx 以开始记录新的日志文件 测试 logrotate 配置 可以手动运行 logrotate 来测试配置是否正确:代码语言:javascript AI 代码解释 sudo logrotate-vf/etc/logrotate.d/nginx 这将强制执行日志切割并显示详细输出。配置 logrotate 定时任务 在 Ubuntu 或 Debian 上,logrotate 是由 cron 任务定期运行的。打开 cron 配置文件:代码语言:javascript AI 代码解释 sudo nano/etc/crontab 并添加以下行,以每天凌晨 3 点切割日志:代码语言:javascript AI 代码解释 03***root/usr/sbin/logrotate/etc/logrotate.conf 保存并退出文件。这样,logrotate 将在每天凌晨 3 点自动运行,并根据上面的配置文件对 nginx 日志进行轮换。重启 cron 服务 cron 服务必须重新启动以使更改生效。在 Ubuntu 或 Debian 上,可以使用以下命令重启 cron 服务:代码语言:javascript AI 代码解释 sudo systemctl restart cron 检查日志切割是否成功 可以检查/var/log/nginx 目录下的日志文件是否按照配置进行轮换和压缩。如果一切正常,nginx 将继续记录新的日志文件,并且旧日志文件将被自动压缩和删除,从而确保磁盘空间不会被无限扩大。

FAQ

Q1: Nginx 本身支持自动日志切割吗?

生产环境如何配置 Nginx 日志切割按天归档并保留 30 天的脚本写法

A1: Nginx 本身不支持按天自动切分日志,需要通过外部工具实现,如 logrotate 或 cron 脚本。

Q2: 切割日志后如何通知 Nginx 生效?

A2: 需要向 Nginx 主进程发送 USR1 信号,或者使用 nginx -s reopen 命令,让 Nginx 重新打开日志文件。

Q3: 如何确保旧日志只保留 30 天?

A3: 在 logrotate 配置中使用 rotate 30 参数,或在 Shell 脚本中使用 find 命令删除 mtime +30 的文件。