Windows 上 nginx 的日志轮换

问题描述 投票:0回答:10

我在网上找到了大量关于在 Linux 下轮换 nginx 日志的参考资料。只需将 USR1 信号发送到进程即可。 但是... Windows 上不存在类似 unix 的信号,我还没有找到任何关于此的信息。 我如何在 Windows 上使用 nginx 完成同样的事情??

windows nginx signals logging rotation
10个回答
10
投票

要在 Windows 中轮换 nginx 日志,请创建一个批处理文件,如下所示:

For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set YMD=%%c-%%a-%%b)
move C:\path\to\nginx\logs\Access.log C:\path\to\nginx\logs\Access_%YMD%.log
move C:\path\to\nginx\logs\Error.log C:\path\to\nginx\logs\Error_%YMD%.log
call C:\path\to\nginx\nginx -p C:\path\to\nginx -s reopen

第一行只是创建一个时间戳(归功于Jay

然后在 Windows 中创建计划任务,以按照您想要轮换日志的频率运行该批处理文件。

如果 nginx 作为服务运行(例如通过此处描述的 Windows 服务包装器),您不能简单地直接调用

nginx -s reopen
等 nginx 命令。相反,您必须以运行服务的用户身份运行命令。

为此,创建一个名为 nginx

(例如)的新用户
,并将服务和计划任务配置为以该用户身份运行。您还必须确保您的用户拥有“作为批处理作业登录”权限。

如果您想在命令行上测试轮换脚本而不必使用计划任务,您可以使用

runas /user:nginx "C:\path\to\rotateLogs.bat"

6
投票

实际上(尽管进行了大量的谷歌搜索)可以在文档页面中找到答案。该命令是

nginx -s reopen
但这似乎只在从命令行运行 nginx 时才有效 – 目前这是在 Windows 上运行 nginx 的唯一官方方法。

我的下一个挑战是弄清楚如何在将 nginx 作为 Windows 服务运行时使其工作,如 将 nginx 作为 Windows 服务运行的答案中所述。


2
投票

使用 Windows Server 2008 R2,我创建了这个批处理文件,并将其安排在每天午夜一次:

@echo off
SET DATE=%date%
SET DAY=%DATE:~0,2%
SET MONTH=%DATE:~3,2%
SET YEAR=%DATE:~6,4%
SET DATE_FRM=%YEAR%-%MONTH%-%DAY%


ECHO %DATE_FRM%

REM ECHO %YEAR%
REM ECHO %MONTH%
REM ECHO %DAY% 

move D:\nginx-1.11.1\logs\access.log D:\nginx-1.11.1\logs\access_%DATE_FRM%.log
move D:\nginx-1.11.1\logs\error.log D:\nginx-1.11.1\logs\error_%DATE_FRM%.log
call D:\nginx-1.11.1\nginx -p D:\nginx-1.11.1 -s reopen

1
投票

1.首先创建一个文件来存储您的日志文件列表,例如“nginx_log.lst”,内容为:

D:\projects xample.com\data\log access.log D:\projects xample.com\data\log rror.log

2.将以下内容保存到bat文件中,例如“nginx_log_rotate.bat”:

@echo off
set YMD=%date:~0,4%%date:~5,2%%date:~8,2%
set LOG_FILE=
FOR /F "eol=; delims=, " %%i in (nginx_log.lst) do (
    echo "%%i"
    move "%%i" "%%i.%YMD%"
)
pushd C:\tools\nginx
nginx -s reopen
popd
pause
@echo on

3.创建一个计划任务来按照您的意愿运行蝙蝠


0
投票

我编写了一个小实用程序,它在停止 nginx(作为 Windows 服务运行)几秒钟后轮换日志文件。

它有特定的要求,即每晚停止,然后复制日志文件,然后重新启动服务。您可以下载代码并以任何您想要的方式更改它。

代码在这里:http://mandar.tumblr.com/post/5419161330/nginx-logrotate-windows

谢谢


0
投票

由于某些原因,下面的批处理文件对我有用。

For /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set YMD=%%c-%%a-%%b)
move .\logs\access.log .\logs\access.%YMD%.log
move .\logs\error.log .\logs\error.%YMD%.log
nginx.exe -s reload

这或多或少与上面Tom的回答相同。


0
投票
@echo off
SET DATE_FRM=%date%

REM set path of Nginx root folder.
SET NGINX_PATH="E:\nginx-1.14.2"

REM create old_logs folder if not exists , we will move old logs in this folder.
if not exist "%NGINX_PATH%\old_logs\NUL" mkdir "%NGINX_PATH%\old_logs"

REM move error.log in old_logs from logs folder and rename it
move %NGINX_PATH%\logs\access.log %NGINX_PATH%\old_logs\access_%DATE_FRM%.log
move %NGINX_PATH%\logs\error.log %NGINX_PATH%\old_logs\error_%DATE_FRM%.log

REM reopn nginx logs, this will create new error.log for nginx.
call %NGINX_PATH%\nginx -p %NGINX_PATH% -s reopen

REM compress error%DATE_FRM%.log, this will create error_%DATE_FRM%.log.zip file.
powershell Compress-Archive -Path %NGINX_PATH%\old_logs\access_%DATE_FRM%.log -DestinationPath %NGINX_PATH%\old_logs\access_%DATE_FRM%.log.zip -force
powershell Compress-Archive -Path %NGINX_PATH%\old_logs\error_%DATE_FRM%.log -DestinationPath %NGINX_PATH%\old_logs\error_%DATE_FRM%.log.zip -force

REM delete error%DATE_FRM%.log from old_logs.
del %NGINX_PATH%\old_logs\access_%DATE_FRM%.log
del %NGINX_PATH%\old_logs\error_%DATE_FRM%.log

0
投票

我使用 NSSM 来管理 Windows 上的 Nginx(在 WhiteHorse 上检查)。尽管此实用程序具有内置旋转功能,但它可能无法正常工作。该文档警告了在线轮换的风险。

应配置两个服务条目:

  1. Nginx 和

  2. Nginx 轮转日志。

该解决方案不支持根据文件大小或文件期限进行轮换。可以使用

nginx -s reopen
设置轮换日志的计划。

首先

使用 NSSM 创建 Nginx Rotate Logs 服务(注意:您可以使用相同的命令来创建主 Nginx 服务)。

下面的命令将创建服务条目:

nssm install "Nginx Rotate" C:\tools\nginx-1.21.6\nginx.exe

下几行将逐步配置服务,oneliner 在此不可用。

nssm set "Nginx Rotate" AppParameters "-s reopen"
nssm set "Nginx Rotate" AppExit Default Exit
nssm set "Nginx Rotate" AppStdout C:\tools\nginx-1.21.6\logs\access.log
nssm set "Nginx Rotate" AppStderr C:\tools\nginx-1.21.6\logs\error.log
nssm set "Nginx Rotate" AppRedirectHook 1
nssm set "Nginx Rotate" AppRotateFiles 1
nssm set "Nginx Rotate" AppRotateOnline 1
nssm set "Nginx Rotate" AppTimestampLog 1
nssm set "Nginx Rotate" Description "Some description"
nssm set "Nginx Rotate" DisplayName "Nginx Rotate Logs"
nssm set "Nginx Rotate" ObjectName DOMAIN\user "password"
nssm set "Nginx Rotate" Start SERVICE_DEMAND_START
nssm set "Nginx Rotate" Type SERVICE_WIN32_OWN_PROCESS

然后编辑服务:

nssm edit "Nginx Rotate"

在您需要设置的最后一个选项卡:

Event = Log rotation + Before online log rotation

如下图所示。

enter image description here

因此,该服务将处于手动模式。启动后,它会旋转日志并停止。

第二个

创建计划任务。

schtasks /create /sc daily /st 03:30 /tn "Nginx Rotate Logs" /tr "C:\Program Files\PowerShell\7\pwsh.exe -command start-service 'Nginx Rotate Logs'"

重要

对 Nginx、Nginx 轮换日志和计划任务使用相同的用户。

用法

当主 Nginx 运行时,计划任务每天运行一次,轮换文件。

辅助

您可以添加每日任务(或添加到钩子选项卡)来压缩和清除旧日志,例如:

# install PSCX module
Install-Module -Name Pscx -AllowPrerelease -AllowClobber

# compress
Get-ChildItem 'C:\tools\nginx-1.21.6\logs\*.log' | Where {$_.lastwritetime -lt (Get-Date).AddDays(-1)} | write-zip

# purge yesterday zip
Get-ChildItem 'C:\tools\nginx-1.21.6\logs\*.zip' | Where {$_.lastwritetime -lt (Get-Date).AddDays(-2)} | Remove-Item -Force

0
投票
@echo off

net stop nginx


for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"

echo move %~dp0\Access.log %~dp0\Old\Access_%fullstamp%.log
move %~dp0\Access.log %~dp0\Old\Access_%fullstamp%.log

echo move %~dp0\Error.log %~dp0\Old\Error_%fullstamp%.log
move %~dp0\Error.log %~dp0\Old\Error_%fullstamp%.log

net start nginx

0
投票

这是一种不同的方法,NO NGINX RESTART它会创建日志文件的副本,然后清除日志文件的内容(不会删除文件本身,因为它是由 NGINX 进程查看的)。

Powershell 脚本

$FileDate = Get-Date -format 'dd.MM.yyyy'
Copy-Item "logs\access.log" "logs\access_$FileDate.log" -Force
Copy-Item "logs\error.log" "logs\error_$FileDate.log" -Force
Clear-Content "logs\access.log" -Force
Clear-Content "logs\error.log" -Force

两行可选行,这将创建一个 zip 文件并删除原始日志文件:

Compress-Archive -Path "logs\*_$FileDate.log" -DestinationPath "logs\logs_$FileDate.zip"
Remove-Item "logs\*_$FileDate.log"

请注意,如果您想创建 Windows 任务,程序/脚本需要是

powershell.exe
并且实际脚本作为参数传递
-file ...

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.