2008-12-10 96 views
7

如何在Window 2000框中旋轉Apache Access和錯誤日誌?Apache rotate訪問和錯誤日​​志Windows

我在下面列出了我的批處理文件作爲答案。

有沒有辦法直接通過Apache配置文件進行此操作?我正在使用以下customlog命令來生成每日日誌。

的CustomLog「|」 「* Apache的路徑/斌/ ROTATELOGS.EXE」 「* Apache的路徑/日誌/備份/ internet_access_%D-%間%y.log」 86400' 組合拳

回答

5

這裏是DOS批處理文件,修改爲註釋。 我每週運行它並保留8周的壓縮備份。 您需要安裝7個zip文件。

我還沒有參數化的路徑,隨意。


@echo off 

:: Name - svrlogmng.bat 
:: Description - Server Log File Manager 
:: 
:: History 
:: Date   Authory Change 
:: 22-May-2005 AGButler Original 
:: 14-Jan-2008 AIMackenzie Changed net stops and paths where necessary 

:: ======================================================== 
:: setup variables and parameters 
:: ======================================================== 

:: generate date and time variables 
for /f "tokens=2,3,4 delims=/ " %%i in ('date /T') do set trdt=%%k%%j%%i 
for /f "tokens=1,2 delims=: " %%i in ('time /T') do set trtt=%%i%%j 
set nftu=%trdt%%trtt% 

:: set the Number Of Archives To Keep 
set /a noatk=8 

:: ======================================================== 
:: turn over log files 
:: ======================================================== 

:: change to the apache log file directory 
cd /D "D:\Program Files\Apache Software Foundation\Apache2.2\logs\" 

:: stop Apache Service, Move log files and restart Apache Service 
"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -k stop 

echo %nftu% >> access.log 
move "D:\Program Files\Apache Software Foundation\Apache2.2\logs\access.log" "D:\Program Files\Apache Software Foundation\Apache2.2\logs\%nftu%_access.log" 

echo %nftu% >> error.log 
move "D:\Program Files\Apache Software Foundation\Apache2.2\logs\error.log" "D:\Program Files\Apache Software Foundation\Apache2.2\logs\%nftu%_error.log" 

"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -k start 

:: ======================================================== 
:: zip todays Access and Error log files, then delete old logs 
:: ======================================================== 

:: zip the files 
"D:\Program Files\7-Zip\7z.exe" a -tzip %nftu%_logs.zip %nftu%_access.log %nftu%_error.log 

:: del the files 
del /Q %nftu%_*.log 

:: ======================================================== 
:: rotate the zip files 
:: ======================================================== 

:: make list of archive zip files 
type NUL > arclist.dat 
for /F "tokens=1,2 delims=[] " %%i in ('dir /B *_logs.zip ^| find /N "_logs.zip"') do echo %%i = %%j>> arclist.dat 

:: count total number of files 
for /F "tokens=1 delims=" %%i in ('type arclist.dat ^| find /C "_logs.zip"') do set tnof=%%i 

:: setup for and create the deletion list 
set /a negtk=%noatk%*-1 
set /a tntd=%tnof% - %noatk% 

type NUL>dellist.dat 
for /L %%i in (%negtk%,1,%tntd%) do find " %%i = " arclist.dat >> dellist.dat 

:: del the old files 
for /F "tokens=3 delims= " %%i in ('find "_logs.zip" dellist.dat') do del /Q %%i 

:: remove temp files 
del /Q arclist.dat 
del /Q dellist.dat 

0

由於我認爲這不是嚴格的編程問題,但AFAIK在Apache中沒有內置的功能來支持日誌輪轉。在UNIX系統上有一個標準實用程序,稱爲logrotate,因此這些系統上的功能將是多餘的。

如果您更改了自己的問題,詢問如何編寫批處理文件以處理Windows 2000上的Apache日誌循環,請使用批處理文件源回覆自己,這可能會對其他人有所幫助。

1

我寫了一個VBS爲Windows 2003箱一次。它使用zip.exe進行壓縮(在info-zip.org上找到)並旋轉apache日誌和php日誌。大於MAX_SIZE時,日誌會旋轉。如果日誌計數通過MAX_ROTATIONS,它會刪除最早的日誌。

請提供有關腳本的反饋。

option explicit 

const DEBUG_MODE = false 
const MAX_ROTATIONS = 10 
const MAX_SIZE = 2097152 ' 2MB 
const WEB_LOGS = "c:\path\to\site\logs" 
const PHP_LOG = "c:\path\to\phplog" 
const APACHE_LOGS = "C:\path\to\Apache2\logs" 
const APACHE_SERVICE ="Apache2.2" ' Name of the apache service for restart 
const ZIP_APP = "c:\path\to\zip.exe" 
const LOGROTATE_LOG = "c:\tmp\logrotate.log" 

dim aLogs 
aLogs = Array("\error.log","\transfer.log","\sec.log","\phperror.log") 

dim oFSO 
set oFSO = CreateObject("Scripting.FileSystemObject") 

if (not DEBUG_MODE) then 
    dim oLogFile 
    set oLogFile = oFSO.CreateTextFile(LOGROTATE_LOG, 2, True) 
end if 

dim bHasRotated 
bHasRotated = false 

Print "Starting log rotation" 
Print "=====================" 
ManageWebLogs() 
ManageApacheLogs() 
ManagePhpLog() 

if (bHasRotated = true) then 
    Print "=====================" 
    RestartService APACHE_SERVICE 
end if 

Print "=====================" 
Print "Log rotation finished" 

if (not DEBUG_MODE) then 
    oLogFile.Close 
    set oLogFile = nothing 
end if 
set oFSO = nothing 

'***************************************************************************** 
' Loop through all the subfolders in the weblog directory 
sub ManageWebLogs() 
    dim oLogDirs 
    set oLogDirs = oFSO.GetFolder(WEB_LOGS) 
    dim oLogDir 
    for each oLogDir in oLogDirs.SubFolders 
     Print "In " & oLogDir.Name 
     RotateLogs(oLogDir) 
    next 
    set oLogDir = nothing 
end sub 

'***************************************************************************** 
' Loop through the log files in the Apache logs directory 
sub ManageApacheLogs() 
    dim oLogDir 
    set oLogDir = oFSO.GetFolder(APACHE_LOGS) 
    Print "In " & oLogDir.Name 
    RotateLogs(oLogDir) 
    set oLogDir = nothing 
end sub 

'***************************************************************************** 
' Loop through the log files in the Apache logs directory 
sub ManagePhpLog() 
    dim oLogDir 
    set oLogDir = oFSO.GetFolder(PHP_LOG) 
    Print "In " & oLogDir.Name 
    RotateLogs(oLogDir) 
    set oLogDir = nothing 
end sub 


'***************************************************************************** 
' Traverse through each of the log file types and check if they need rotation 
sub RotateLogs(ByVal oFolder) 
    dim sLog 
    dim oLog 
    for each sLog in aLogs 
    if oFSO.FileExists(oFolder.Path & sLog) then 
     set oLog = oFSO.GetFile(oFolder.Path & sLog) 
     if (oLog.Size > MAX_SIZE) then 
     RotateLog oFolder.Path & sLog 
     ArchiveLog oFolder.Path & sLog 
     bHasRotated = true 
     end if 
    end if 
    next 
    set oLog = nothing 
end sub 


'***************************************************************************** 
' Rotates the given log, by incrementing the file name 
sub RotateLog(ByVal sLog) 
    dim i 
    dim sOldFile, sNewFile 
    for i = MAX_ROTATIONS to 1 step -1 
    sOldFile = sLog & "." & i & ".zip" 
    sNewFile = sLog & "." & (i+1) & ".zip" 
    if oFSO.FileExists(sOldFile) and i = MAX_ROTATIONS then 
     ' Delete zipfile   
     Print "-- Deleting " & sOldFile 
     oFSO.DeleteFile(sOldFile) 
    elseif oFSO.FileExists(sOldFile) then 
     ' Rename zipfile 
     Print "-- Renaming " & sOldFile & " to " & sNewFile 
     oFSO.MoveFile sOldFile, sNewFile 
    end if 
    next 
end sub 


'***************************************************************************** 
' Zips the current log 
sub ArchiveLog(ByVal sLog) 
    Dim oShell 
    Set oShell = CreateObject("WScript.Shell") 
    dim sZipFile 
    sZipFile = sLog & ".1.zip" 
    Print "-- Archiving " & sLog & " to " & sZipFile 
    oShell.Run "cmd /c " & ZIP_APP & " -jq " & sZipFile & " " & sLog, 0, true 
    oFSO.DeleteFile(sLog) 
    set oShell = nothing 
end sub 


' **************************************************************************** 
' Restarts a given service (in our case Apache) 
private sub RestartService(_ 
    ByVal sService _ 
) 

    Dim oShell 
    Set oShell = CreateObject("WScript.Shell") 

    ' Service stopped with 'Net' command 
    oShell.Run "cmd /c net stop " & sService, 0, true 
    Print sService & " service stopped" 

    ' Service started with 'Net' command 
    oShell.Run "cmd /c net start " & sService, 0, true 
    Print sService & " service restarted" 

    set oShell = nothing 
end sub 


'***************************************************************************** 
' Echoes out the given message if in debug mode 
sub Print(ByVal sMsg) 
    if (DEBUG_MODE) then 
    wscript.echo sMsg 
    else 
    oLogFile.WriteLine sMsg 
    end if 
end sub 
2

我已經稍微擴展了bat-script。您可以將它用於英語和德語日期。您將需要像腳本一樣的目錄中的7za.exe。用於旋轉的日誌目錄和文件可以明確設置。

@echo off 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
:: ======================================================== 
:: setup variables and parameters 
:: ======================================================== 

:: USE Service Display Name, Services are space-separated -> Syntax: "Display Name 1" "Display Name 2" 
SET ROTATE_SERVICES="Apache2.2" 

:: setting LOG-directory, log-files in this directory should be rotate 
SET ROTATE_LOGDIR=F:\xampp\apache\logs 

:: files which should rotate (space separated) 
SET ROTATE_FILES=access.log error.log ssl_request.log 

:: SET the Number Of Archives To Keep 
SET /a keptarchives=5 

:: SET delimiter for date format (english "/", german ".") 
SET DATEDEL=. 
:: ======================================================== 
:: DO NOT CHANGE ANYTHING 
:: ======================================================== 

:: Check for existing Log-directory 
IF NOT EXIST "%ROTATE_LOGDIR%" (
    CALL :LOG Please check your paths to Log Directory 
    PAUSE 
    GOTO :EOF 
) 

:: Check for existing Log-files 
FOR %%d IN (%ROTATE_FILES%) DO (
    IF NOT EXIST "%ROTATE_LOGDIR%\%%d" (
     CALL :LOG File %ROTATE_LOGDIR%\%ROTATE_LOGFILES% does not exist! 
     PAUSE 
     GOTO :EOF 
    ) 
) 

:: generate date and time variables for execution 
FOR /f "tokens=1,2,3 delims=%DATEDEL% " %%i IN ('date /T') DO SET execdate=%%k%%j%%i 
FOR /f "tokens=1,2 delims=: " %%i IN ('time /T') DO SET exectime=%%i%%j 
SET fullexectime=%execdate%_%exectime% 
:: ======================================================== 


:: ======================================================== 
:: Operations 
:: ======================================================== 

FOR %%d IN (%ROTATE_SERVICES%) DO (
    NET STOP %%d 
) 

FOR %%d IN (%ROTATE_FILES%) DO (
    cd /d %ROTATE_LOGDIR% 
    IF NOT EXIST OLD (MKDIR OLD) 
    move %%d %ROTATE_LOGDIR%\OLD\%fullexectime%_%%d 
) 

FOR %%d IN (%ROTATE_SERVICES%) DO (
    NET START %%d 
) 

:: ======================================================== 
:: ZIP - LOGFILES 
:: ======================================================== 
cd /d %ROTATE_LOGDIR%\OLD 
CALL "%~dp0\7za.exe" a %ROTATE_LOGDIR%\OLD\%fullexectime%_log.zip %ROTATE_LOGDIR%\OLD\%fullexectime%_*.log 
    IF %ERRORLEVEL% NEQ 0 (
     CALL :LOG Error while compressing log-file. Log will not deleted and not rotated. Check your OLD-directory! 
     PAUSE 
     GOTO :EOF 
    ) 
del /Q %fullexectime%_*.log 

:: ======================================================== 
:: ROTATE - ZIPPED LOGFILES 
:: ======================================================== 

:: make list of archive zip files 
type NUL > arclist.dat 
for /F "tokens=1,2 delims=[] " %%i in ('dir /B *_log.zip ^| find /N "_log.zip"') do echo %%i = %%j>> arclist.dat 

:: count total number of files 
for /F "tokens=1 delims=" %%i in ('type arclist.dat ^| find /C "_log.zip"') do set tnof=%%i 

:: setup for and create the deletion list 
set /a negtk=%keptarchives%*-1 
set /a tntd=%tnof% - %keptarchives% 

type NUL>dellist.dat 
for /L %%i in (%negtk%,1,%tntd%) do find " %%i = " arclist.dat >> dellist.dat 

:: del the old files 
for /F "tokens=3 delims= " %%i in ('find "_log.zip" dellist.dat') do del /Q %%i 

:: remove temp files 
del /Q arclist.dat 
del /Q dellist.dat 


GOTO :EOF 

:LOG 
    SET MSG=[%DATE%, %TIME: =0%] %* 
    ECHO.%MSG% 
    SET MSG= 
    GOTO :EOF 
pause