windows 下分割nginx日志

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

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

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

如果能正确输出昨天日期的话,那么这一点我们就搞定了 。

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

    @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%\green\httpServer\nginx-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 实时地查看日志文件的输出。
更多参考

    需要了解更多在 Linux 中使用 kill 命令向 Nginx 进程发送其他信号,以及该信号的意义可以参考 Nginx 中文 Wiki 上的 运行和控制 Nginx – 命令行参数和信号 这篇中文文档。
    Windows 平台使用 nginx -s 命令向 Nginx 主进程发送各种信号,以及该信号的意义可以在 安装Nginx 一文的最后找到。

######################################################################################

此方法是将nginx停止,然后移动并重命名文件的方式来实现日志切割。假如没有将nginx停止,就算重命名或移动文件,nginx还是会向原文件写内容,太奇怪了。不知道有没有其他方法来实现nginx日志切割。

1、将nginx以服务方式启动;

2、新建nginxSplitLog.bat文件,具体内容如下(rem为注释符号,我的nginx日志目录为D:\nginx\logs,日志备份目录为D:\nginx\logs\logbak\)

@ECHO OFF

rem 停止nginx服务
net stop nginx

 

rem 杀掉nginx进程,因为一个服务可能启动多个nginx进程
taskkill /F /IM nginx.exe

 

rem 产生移动日志文件命令
set "cmdstr=move D:\nginx\logs\access.log D:\nginx\logs\logbak\access%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%.log"

 

rem 移动日志文件
call %cmdstr%"

 

rem 启动nginx服务
net start nginx

3、在windows计划任务里新建一个计划任务,每天晚上定时执行nginxSplitLog.bat文件

posted @ 2012-09-26 11:14  望月人  阅读(1531)  评论(0编辑  收藏  举报