Comparto este artículo para tenerlo anotado en el blog y así poder probarlo en otra ocasión.
Fuente: http://borrame.com/recortes/apache/log-rotate.html
Requisitos:
- Apache debe estar instalado como servicio
Procedimiento que sigue el script BAT:
- Detener Apache
- Mover los logs recientes
- Iniciar Apache
- Comprimir los logs movidos
- Ir renombrando los logs como
foo.log.1
,foo.log.2
... y borrar los más antiguos
Script BAT:
@echo off rem rem Rotación de logs de Apache - v2014-02-05 rem rem Realiza una rotación de logs de Apache instalado como servicio de Windows rem chcp 1252 > NUL rem Necesario para usar variables en un bucle FOR setlocal enabledelayedexpansion rem Directorio de logs set DIR_LOGS=%ProgramFiles%Apache Software FoundationApache2.2logs rem Definición de los logs que vamos a rotar (debe ser válida dentro de un bucle FOR) set DEF_LOG="%DIR_LOGS%*access.log" "%DIR_LOGS%*error.log" rem Nº máximo de logs rotados que se conservarán set MAX_LOGS_ANTIGUOS=8 rem Si esta variable existe se comprimirán los logs rotados (requiere NTFS); rem comentar con REM para desactivar set COMPRIMIR_LOGS=Sí, por favor rem Ejecutable de Apache 2 (ruta completa si la carpeta no está en %PATH%) set APACHE=%ProgramFiles%Apache Software FoundationApache2.2binhttpd.exe rem Nombre del servicio set SERVICIO=Apache2.2 rem Si esta variable existe se insertará un PAUSE al final para poder leer la salida rem en sesiones no interactivas; comentar con REM para desactivar set PAUSA_AL_FINAL=Sí, por favor rem Sufijo para los archivos temporales set SUFIJO_TMP=.log_rotate_tmp-%RANDOM%%RANDOM% echo ========================================================================== echo Verificando la configuración de Apache... echo. "%APACHE%" -t echo. if %ERRORLEVEL% NEQ 0 ( goto cfg_err ) else ( goto cfg_ok ) :cfg_err echo Se han encontrado errores, no se puede continuar. goto fin :cfg_ok echo La configuración es correcta. echo ========================================================================== echo Deteniendo el servicio "%SERVICIO%"... echo. net stop "%SERVICIO%" if %ERRORLEVEL% NEQ 0 ( goto apagado_err ) else ( goto apagado_ok ) :apagado_err echo Ha fallado el apagado del servicio. goto fin :apagado_ok echo El servicio ha sido detenido con éxito. echo ========================================================================== echo Moviendo los logs recientes del directorio "%DIR_LOGS%"... echo. for %%i in (%DEF_LOG%) do ( set LOG=%%i set NOMBRE=%%~nxi set RUTA=%%~dpi echo !NOMBRE! -^> !NOMBRE!%SUFIJO_TMP% move /y "!LOG!" "!RUTA!!NOMBRE!%SUFIJO_TMP%" > NUL ) echo. echo Los logs han sido movidos con éxito. echo ========================================================================== echo Arrancando el servicio "%SERVICIO%"... echo. net start "%SERVICIO%" if %ERRORLEVEL% NEQ 0 ( goto arrancado_err ) else ( goto arrancado_ok ) :arrancado_err echo Ha fallado el arrancado del servicio. goto fin :arrancado_ok echo El servicio ha sido arrancado con éxito. if defined COMPRIMIR_LOGS ( echo ========================================================================== echo Comprimiendo los logs movidos... echo. for %%i in (%DEF_LOG%) do ( set NOMBRE=%%~nxi set RUTA=%%~dpi echo !NOMBRE!%SUFIJO_TMP% compact /c "!RUTA!!NOMBRE!%SUFIJO_TMP%" > NUL ) echo. echo Los logs han sido comprimidos con éxito. echo. ) echo ========================================================================== echo Rotando los logs antiguos... echo. rem rem Bucle principal: recorremos cada log en uso rem for %%i in (%DEF_LOG%) do ( set LOG=%%i set NOMBRE=%%~nxi set SUFIJO_TMP=%SUFIJO_TMP% call :rotar ) goto fin_rotar rem rem Bucle interior: dado un log, rotamos todas sus copias rem :rotar echo Rotando !NOMBRE! set /a HASTA=!MAX_LOGS_ANTIGUOS! rem rem Si ya tenemos el máximo de logs, eliminamos el último rem if exist "!LOG!.!HASTA!" ( echo Eliminando !NOMBRE!.!HASTA! del "!LOG!.!HASTA!" ) :siguiente_rotar set /a DESDE=!HASTA!-1 if !DESDE! equ 0 ( rem Log más reciente echo !NOMBRE!!SUFIJO_TMP! -^> !NOMBRE!.!HASTA! rename "!LOG!!SUFIJO_TMP!" "!NOMBRE!.!HASTA!" ) else ( rem Log archivado if exist "!LOG!.!DESDE!" ( echo !NOMBRE!.!DESDE! -^> !NOMBRE!.!HASTA! rename "!LOG!.!DESDE!" "!NOMBRE!.!HASTA!" ) ) set /a HASTA=!HASTA!-1 if !HASTA! neq 0 ( goto siguiente_rotar ) goto :EOF :fin_rotar echo. echo Los logs han sido rotados con éxito. echo ========================================================================== :fin echo. echo. if defined PAUSA_AL_FINAL ( pause ); endlocal
Consultar la fuente para obtener la última versión del script.