nginx 日志路径配置修改
Nginx的日志文件不能直接在线变更,但可通过特定操作实现日志文件的切换。具体方法如下:
日志文件切换方法
- 重命名旧日志文件
通过mv
命令将当前日志文件重命名(例如将/var/log/nginx/access.log
改为/var/log/nginx/access.log.1
)。 - 发送
USR1
信号
向Nginx主进程发送USR1
信号(如使用命令kill -USR1 [nginx主进程号]
),Nginx会重新打开配置文件中指定的日志文件并关闭旧文件。 12 - 处理旧日志文件
完成上述操作后,可手动移动或删除旧日志文件。
注意事项
- 发送
USR1
信号时需确保Nginx配置文件中的日志路径正确。 - 切换日志文件时建议暂停相关服务或业务,避免数据丢失。
- 若需定时切换日志,可结合
crontab
和脚本实现自动化操作。
-----------------------------------------------------------
为了配置Nginx 1.26.1的日志按天输出,你可以采用以下几种方法。下面我将详细解释每种方法的步骤:
方法一:使用logrotate工具
-
安装logrotate(如果尚未安装):
- 在基于Debian的系统上,如Ubuntu,你可以使用
sudo apt-get install logrotate
命令安装。 - 在基于Red Hat的系统上,如CentOS,你可以使用
sudo yum install logrotate
命令安装。
- 在基于Debian的系统上,如Ubuntu,你可以使用
-
配置logrotate:
- 创建或编辑
/etc/logrotate.d/nginx
文件。 - 添加以下内容来配置日志按天切割:
/var/log/nginx/*.log { daily missingok rotate 7 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript }
- 这里,
/var/log/nginx/*.log
指定了Nginx日志文件的路径,daily
表示每天切割一次日志,rotate 7
表示保留最近7天的日志文件,compress
表示压缩旧的日志文件,delaycompress
表示推迟到下一次切割时才压缩,notifempty
表示如果日志文件为空则不进行切割,create 0640 www-data adm
表示创建新的日志文件并设置权限,sharedscripts
表示在切割所有指定的日志文件后只运行一次postrotate
脚本,postrotate
脚本中的命令用于通知Nginx重新打开日志文件。
- 创建或编辑
-
测试logrotate配置:
- 你可以使用
logrotate -d /etc/logrotate.d/nginx
命令来测试配置是否正确,而不会实际执行切割操作。 - 如果配置正确,你可以使用
logrotate -f /etc/logrotate.d/nginx
命令来强制执行一次切割操作。
- 你可以使用
方法二:编写Shell脚本
-
创建Shell脚本:
- 创建一个名为
nginx_log_rotate.sh
的Shell脚本文件。
- 创建一个名为
-
编写脚本内容:
- 在脚本文件中添加以下内容:
#!/bin/bash # author: your_name set -e sleep 1 yesterday=$(date -d 'yesterday' +%Y-%m-%d) ng_logs_dir='/var/log/nginx' if [ -d $ng_logs_dir ]; then cd $ng_logs_dir mv access.log access_${yesterday}.log kill -USR1 $(cat /var/run/nginx.pid) sleep 1 tar -czf access_${yesterday}.log.tar.gz access_${yesterday}.log rm -f access_${yesterday}.log else echo "日志目录不存在,请检查" exit 0 fi
- 这个脚本会获取昨天的日期,将
access.log
重命名为包含昨天日期的文件名,然后发送USR1
信号给Nginx主进程以重新打开日志文件,接着将旧的日志文件压缩并删除。
- 在脚本文件中添加以下内容:
-
设置脚本权限:
- 使用
chmod +x nginx_log_rotate.sh
命令为脚本设置执行权限。
- 使用
-
设置定时任务:
- 使用
crontab -e
命令编辑定时任务。 - 添加一行
0 0 * * * /path/to/nginx_log_rotate.sh
来设置每天凌晨0点执行脚本。
- 使用
方法三:利用Nginx变量进行日志分割(高级用法)
-
修改Nginx配置文件:
- 在Nginx配置文件中添加以下配置来使用变量动态命名日志文件:
http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/${year}_${month}_${day}_access.log main; map $time_iso8601 $year { '~^(\d{4})-' $1; } map $time_iso8601 $month { '~^(\d{4})-(\d{2})-' $2; } map $time_iso8601 $day { '~^(\d{4})-(\d{2})-(\d{2})' $3; } }
- 这里使用了
map
指令来根据$time_iso8601
变量的值提取年、月、日,并将它们用于动态命名日志文件。
- 在Nginx配置文件中添加以下配置来使用变量动态命名日志文件:
-
重新加载Nginx配置:
- 使用
nginx -s reload
命令重新加载Nginx配置以应用更改。
- 使用
注意:这种方法在容器环境中可能不适用,因为容器通常不建议直接修改日志文件。在容器环境中,你可能需要将日志挂载到主机文件系统上,并在主机上使用logrotate或类似的工具来处理日志。
以上三种方法都可以实现Nginx 1.26.1日志按天输出的配置。你可以根据自己的需求和环境选择合适的方法。如果你有任何进一步的问题或需要更详细的说明,请随时告诉我。