nginx日志分割(linux)

本文提供了一段Nginx日志分割脚本,帮助您实现Nginx日志的定时分割,解决日志文件过大导致的问题。通过设置计划任务,脚本会在指定时间自动执行,将日志文件按日期分割,便于管理和查找。
默认情况下,nginx是不分割访问日志的。
当网站的日志文件将会越来越大,占用空间不说,如果有问题要查看网站的日志的话,庞大的文件也将很难打开。

可以借助本文分享的这段 nginx日志分割脚本,实现nginx日志的定时分割。

使用方法,先将以下脚本保存为 cutlog.sh,放在/root 目录下,然后给予此脚本执行的权限

复制代码代码如下:
chmod +x cutlog.sh

然后使用crontab -e 将此脚本加入到计划任务中,

复制代码代码如下:
00 00 * * * /bin/bash /root/cutlog.sh

让此脚本每天凌晨0点0分执行。

复制代码代码如下:
#!/bin/bash
#function:cut nginx log files shell
#设置您的网站访问日志保存的目录,我的统一放在了/home/wwwlogs目录下
log_files_path="/home/wwwlogs/"
log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
#设置你想切割的nginx日志文件名称,比如设置的日志文件名是www.jbxue.com.log 的话,那这里直接填写 www.jbxue.com 即可
log_files_name=(52listen.com access)
#设置nginx执行文件的路径。
nginx_sbin="/usr/local/nginx/sbin/nginx"
#设置你想保存的日志天数,我这里设置的是保存30天之前的日志
save_days=30
############################################
#Please do not modify the following script #
############################################
mkdir -p $log_files_dir
log_files_num=${#log_files_name[@]}
#cut nginx log files
for((i=0;i<$log_files_num;i++));do
mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
done
#delete 30 days ago nginx log files
find $log_files_path -mtime +$save_days -exec rm -rf {} \;
$nginx_sbin -s reload
Nginx日志分割配置方法在不同操作系统下有所不同,以下分别介绍: ### Linux系统 在Linux系统中,可借助logrotate工具来配置Nginx日志分割。首先,在`/etc/logrotate.d`中创建文件`nginx`,该文件作为Nginx日志分割的配置文件。示例配置如下: ```plaintext /opt/docker-ws/nginx/logs/*.log { daily # 每天分割一次 size 5M # 源文件小于5M时不分割 rotate 30 # 保留最近30个分割后的日志文件 copytruncate notifempty # 当日志文件为空时不分割 missingok dateext # 切割后的文件添加日期作为后缀 } ``` 此配置指定每天执行一次分割,并且当文件大于5M时才进行分割。同时,`notifempty`参数确保当日志文件为空时不进行分割,`dateext`参数会在切割后的文件添加日期作为后缀,`rotate 30`表示保留最近30个分割后的日志文件 [^1]。 另外,还可以通过crontab定时任务来执行日志切割脚本。例如在打开的文件最末尾添加如下内容,可实现每天凌晨00:01执行Nginx日志切割脚本: ```plaintext 01 00 * * * /home/web/scripts/rotate_nginx_logs.sh > /dev/null 2>&1 ``` ### Windows系统 在Windows系统下实现Nginx自动分割日志,可通过批处理脚本完成。以下是示例脚本: ```batch @shift ::设置nginx安装文件路径和当天时间变量 @echo off set nginx_dir=D:\nginx-1.16.0 set dir=%nginx_dir%\logs\cut_log set log=%nginx_dir%\logs\access.log set errorlog=%nginx_dir%\logs\error.log set today=%date:~0,4%-%date:~5,2%-%date:~8,2% ::判断nginx安装文件路径设置是否正确 :exist_nginx_dir @echo off if exist %nginx_dir% ( cd %nginx_dir% goto check_log ) else ( echo 此路径%nginx_dir%不存在,请检查 goto stop ) ::判断nginx的access.log :check_log @echo off if exist %log% ( goto check_dir ) else ( echo %log%文件不存在,请检查 goto stop ) ::判断nginx的cut_log目录 :check_dir @echo off if exist %dir% ( goto main ) else ( md "%dir%" goto main ) ::创建相关目录和对nginx日志进行切割 :main @echo off ::结束nginx进程 taskkill /F /IM nginx.exe > nul move "%log%" "%dir%\access-%today%.log" > nul move "%errorlog%" "%dir%\error-%today%.log" > nul start nginx.exe ``` 该脚本首先设置了Nginx安装路径、日志文件路径和日期变量,然后依次检查Nginx安装路径、日志文件和切割日志的目录是否存在,若不存在则创建相应目录。接着结束Nginx进程,将访问日志和错误日志移动到指定目录并添加日期后缀,最后重新启动Nginx [^2]。 ### 通过Nginx配置文件修改 还可以在Nginx配置文件本身进行日志切割配置,代码如下: ```nginx if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") { set $year $1; set $month $2; set $day $3; set $hour $4; set $minutes $5; set $seconds $6; } access_log logs/access_$year-$month-$day-$hour-$minutes-$seconds.log main; error_log logs/error_$year-$month-$day-$hour-$minutes-$seconds.log main; ``` 此配置会依据时间戳对日志文件进行命名,从而实现日志分割 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值