转:Nginx 日志文件切割

摘要:
Linux平台切割在Linux平台上进行切割,需要使用date命令以获得昨天的日期、使用kill命令向Nginx进程发送重新打开日志文件的信号,以及crontab设置执行任务周期。/bin/bash##零点执行该脚本##Nginx日志文件所在的目录LOGS_PATH=/usr/local/nginx/logs##获取昨天的yyyy-MM-ddYESTERDAY=$##移动文件mv${LOGS_PATH}/access.log${LOGS_PATH}/access_${YESTERDAY}.log##向Nginx主进程发送USR1信号。新浪博客上有一篇文章nginxforwindows日志切割,但这篇文章有两个不足之处:切割后的日志文件不是以昨天的日期命名;需要停止Nginx服务。

http://www.cnblogs.com/benio/archive/2010/10/13/1849935.html

偶然发现access.log有21G大,所以将其切割。

Nginx 是一个非常轻量的 Web 服务器,体积小、性能高、速度快等诸多优点。但不足的是也存在缺点,比如其产生的访问日志文件一直就是一个,不会自动地进行切割,如果访问量很大的话,将 导致日志文件容量非常大,不便于管理。当然了,我们也不希望看到这么庞大的一个访问日志文件,那需要手动对这个文件进行切割。

在 Linux 平台上 Shell 脚本丰富,使用 Shell 脚本加 crontab 命令能非常方便地进行切割,但在 Windows 平台上就麻烦一些了,刚才弄了好长时间,就在这里记录整理一下。

日志文件切割要求

由于 Nginx 的日志都是写在一个文件当中的,因此,我们需要每天零点将前一天的日志存为另外一个文件,这里我们就将 Nginx 位于 logs 目录中的 access.log 存为 access_[yyyy-MM-dd].log 的文件。其实 logs 目录中还有个 error.log 的错误日志文件,这个文件也需要每天切割一个,在这里就说 access.log 了,error.log 的切割方法类似。

Linux 平台切割

在 Linux 平台上进行切割,需要使用 date 命令以获得昨天的日期、使用 kill 命令向 Nginx 进程发送重新打开日志文件的信号,以及 crontab 设置执行任务周期。

先创建一个 Shell 脚本,如下:

Shell代码
  1. #!/bin/bash
  2. ##零点执行该脚本
  3. ##Nginx日志文件所在的目录
  4. LOGS_PATH=/usr/local/nginx/logs
  5. ##获取昨天的yyyy-MM-dd
  6. YESTERDAY=$(date-d”yesterday”+%Y-%m-%d)
  7. ##移动文件
  8. mv${LOGS_PATH}/access.log${LOGS_PATH}/access_${YESTERDAY}.log
  9. ##向Nginx主进程发送USR1信号。USR1信号是重新打开日志文件
  10. kill-USR1$(cat/usr/local/nginx/nginx.pid)
#!/bin/bash
## 零点执行该脚本
## Nginx 日志文件所在的目录
LOGS_PATH=/usr/local/nginx/logs
## 获取昨天的 yyyy-MM-dd
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
## 移动文件
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/nginx.pid)

上面这个脚本中的最后一行必须向 Nginx 的进程发送 USR1 信号以重新打开日志文件,如果不写的话,Nginx 会继续将日志信息写入 access_[yyyy-MM-dd].log 的那个文件中,这显然是不正确的。

脚本完成后将其存入 Nginx 安装目录的 sbin 中,取名为 cut-log.sh,之后使用 crontab -e 新增一个定时任务,在其中增加执行这个脚本:

Shell代码
  1. 00***/bin/bash/usr/local/nginx/sbin/cut-log.sh
0 0 * * * /bin/bash /usr/local/nginx/sbin/cut-log.sh

到这里 Linux 下切割 Nginx 日志就完成了,可以将 crontab 设置为距当前时较近的时间测试一下,否则在零点出问题就不好了转:Nginx 日志文件切割第1张

Windows 平台切割

要在 Windows 平台上做这件事情就有点麻烦了。在 Windows 中没有原生的命令能够获得昨天的日期,Windows 中的计划任务设置我感觉也没有 Linux 的 crontab 用得方便,再有批处理命令也没有 Shell 脚本功能强大。总之,逐一来解决这些问题吧。

新浪博客上有一篇文章nginx for windows日志切割,但这篇文章有两个不足之处:切割后的日志文件不是以昨天的日期命名;需要停止 Nginx 服务。为了切割日志停止服务,我认为有所不值,如果访问量较小的话问题不大,但是访问量较大的话这种做法是非常不可取的。为了弥补这些缺陷,我们对这个批处理文件进行了改进。

要 Windows 平台上使用 Linux 的 date 命令以获得昨天的日期,我们可以到SourceForge上去下载UnxUtils这 个工具。UnxUtils 是个非常强大的工具集,将大多数的 Linux 命令都移植到 Windows 平台上来了,比如:ls, grep, wc 等等 120 个命令,当然了其中也包括了我们需要的 date 工具。将这个工具解压到一个目录中,假定是 d:common-pathUnxUtils 目录中,将那些工具所在的 d:common-pathUnxUtilsusrlocalwbin 添加到系统的环境变量 PATH 中,可以加到最后去。由于 Windows 平台中有 date 内置命令,因此需要将 UnxUtils 的 date.exe 改名为其他的,比如改为 udate.exe。用 cmd 打开控制台,输入:

D:>udate -d "yesterday" +%Y-%m-%d
2010-05-31
D:>_

如果能正确输出昨天日期的话,那么这一点我们就搞定了转:Nginx 日志文件切割第2张

接下来需要写一个批处理文件,假定我们的 Nginx 是放在 d:httpServer ginx-0.7.64 目录中的,我们就在这个目录中建一个 cut-log.bat 的文件:

Batch代码
  1. @echooff
  2. rem获取昨天的日期,存入YESTERDAY变量,udate参数中的%需要改成%%进行转义
  3. for/f%%ain(‘udate-d”yesterday”+%%Y-%%m-%%d’)dosetYESTERDAY=%%a
  4. rem设置Nginx位于的盘符
  5. setNGINX_DRIVER=d:
  6. rem设置Nginx的主目录
  7. setNGINX_PATH=%NGINX_DRIVER%greenhttpServer ginx-0.7.64
  8. rem设置Nginx的日志目录
  9. setLOG_PATH=%NGINX_PATH%logs
  10. rem移动文件
  11. move%LOG_PATH%access.log%LOG_PATH%access_%YESTERDAY%.log
  12. rem切换到Nginx所在的盘符
  13. %NGINX_DRIVER%
  14. rem进入Nginx的主目录
  15. cd%NGINX_PATH%
  16. rem向nginx发送reopen信号以重新打开日志文件,功能与Linux平台中的kill-USR1一致
  17. nginx-sreopen
  18. echoon
@echo off
rem  获取昨天的日期,存入 YESTERDAY 变量,udate 参数中的 % 需要改成 %% 进行转义
for /f %%a in ('udate -d "yesterday" +%%Y-%%m-%%d') do set YESTERDAY=%%a
rem 设置 Nginx 位于的盘符
set NGINX_DRIVER=d:
rem 设置 Nginx 的主目录
set NGINX_PATH=%NGINX_DRIVER%greenhttpServer
ginx-0.7.64
rem 设置 Nginx 的日志目录
set LOG_PATH=%NGINX_PATH%logs
rem 移动文件
move %LOG_PATH%access.log %LOG_PATH%access_%YESTERDAY%.log
rem 切换到 Nginx 所在的盘符
%NGINX_DRIVER%
rem 进入 Nginx 的主目录
cd %NGINX_PATH%
rem 向 nginx 发送 reopen 信号以重新打开日志文件,功能与 Linux 平台中的 kill -USR1 一致
nginx -s reopen
echo on

这个批处理写好后,将其加入 Windows 的计划任务中,设置为每天零时执行。需要注意的是,在执行 nginx -s reopen 命令时,当前目录必须位于 Nginx 的主目录中,否则会找不到日志文件在哪个目录中(估计 Nginx 默认采用相对路径寻找),这也就是批处理中需要进入盘符和 Nginx 主目录的原因了,因为任务计划执行时并不是在 Nginx 的主目录中。

结束语

这里主要介绍了一下 Linux 平台和 Windows 平台上切割 Nginx 日志文件的方法。Linux 中可以直接使用一些内置的命令完成,而在 Windows 中需要装载 UnxUtils 工具,不过这个工具集非常有用,比如使用其中的 tail 命令,我们在 Windows 中也能很方便地在控制台中使用 tail -f 实时地查看日志文件的输出。

更多参考

Permalink to: http://www.bluek.org/blog/index.php/2010/08/11/178/

免责声明:文章转载自《转:Nginx 日志文件切割》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DNS服务基础光栅化三维场景的基本流程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux下的IPC机制

Linux下的IPC机制 IPC(Inter-Process Communication)是多个进程之间相互沟通的一种方法。在linux下有多种进程间通信的方法。 共享内存 Linux内存共享有多种,如mmap()、Posix共享内存、System V 共享内存。 1>mmp()通过映射一个普通文件实现共享内存,具有文件实体,shmget()对应文件...

在debian下安装QT 5.10 32位

  准备工作: 在开始之前最好把GCC升级到5.0以上。 如果升级后出现“libstdc++.so.6: version `CXXABI_1.3.9' not found”错误,可以参考https://blog.csdn.net/zx714311728/article/details/69628836解决。 -----------------------...

【Linux】使用fsck对磁盘进行修复

在后台执行 磁盘修复 nohup fsck.ext3 -y /dev/sdb1 > /root/fsck.log 2>&1 & 使用nohup和& 让进程在后台执行; nohup的解释: nohup - run a command immune to hangups, with output to a non-tt...

linux清理内存命令

  1.清理前内存使用情况 free -m 2.开始清理  echo 1 > /proc/sys/vm/drop_caches3.清理后内存使用情况 free -m4.完成!查看内存条数命令: dmidecode | grep -A16 "Memory Device$" ++++++++++++++++++++++++++++++++++++...

Linux新增用户,并设置Root(管理员)权限

在使用Linux过程中,Root账号拥有最大的操作权限。为保证Root账号安全,一般不直接使用Root账号,而是直接创建一个拥有Root权限的其它账号来使用。详细操作步骤如下 第一步,创建用户,如下图所示: 执行命令:usermod -a -G wheel ypsroot 将用户加入管理权限组 第二步,修改sudoers文件为可修改状态,如下图所示:...

C#获取当前路径

//获取包含清单的已加载文件的路径或 UNC 位置。         public static string sApplicationPath = Assembly.GetExecutingAssembly ( ).Location;         //result: X:\xxx\xxx\xxx.dll (.dll文件所在的目录+.dll文件名)...