Rotar log de Apache 2.4 en Windows

El script original lo encuentra en: http://borrame.com/recortes/apache/log-rotate.html . Excelente, se los recomiendo.

Tuve que hacerle unas modificaciones por que en mi caso necesito conservar todos los log y también cambie el nombre temporal para que se escriba con la fecha (yyyyMMddHHmmss)

Código formateado gracias a http://hilite.me/

Archivo logrotate.bat
********************************************************************

@echo off
rem
rem Rotación de logs de Apache - v2015-11-29
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=C:\xampp\apache\logs

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" "%DIR_LOGS%\*mod_jk.log"

rem Nº máximo de logs rotados que se conservarán
set MAX_LOGS_ANTIGUOS=1000

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=C:\xampp\apache\bin\httpd.exe

rem Nombre del servicio
set SERVICIO=Apache2.4

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 anio=%date:~6,4%
for /l %%a in (1,1,31) do if "!anio:~-1!"==" " set anio=!anio:~0,-1!
set mes=%date:~3,2%
set dia=%date:~0,2%
set hora=%time:~0,2%
set hora=%hora: =0%
set minuto=%time:~3,2%
set segundo=%time:~6,2%
set SUFIJO_TMP=.%anio%%mes%%dia%%hora%%minuto%%segundo%


rem 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 Los logs han sido rotados con éxito.



echo ==========================================================================
:fin
echo.
echo.


if defined PAUSA_AL_FINAL (
    pause
);
endlocal

********************************************************************


Recomendaciones del autor http://borrame.com/recortes/apache/log-rotate.html: Uno de los incordios de usar Apache en Windows es que no trae una forma decente de rotar los logs. La utilidad incluida, rotatelogs[Enlace externo], tiene entre otros vicios la desagradable tendencia de ir dejando procesos colgados en memoria. La alternativa que recomiendan en el manual, cronolog[Enlace externo], cojea del mismo pie. Hay módulos que no tienen ese fallo (aunque sí otros) pero nunca hay binarios para tu versión de Apache. Un lío, vamos.
Este script *.bat permite rotar los logs de Apache en Windows (instalado como servicio) usando un mecanismo parecido al que emplea el programa de Linux logrotate[Enlace externo] (no confundir con ninguno de los anteriores), a saber:
  1. Detener Apache
  2. Mover los logs recientes
  3. Iniciar Apache
  4. Comprimir los logs movidos
  5. Ir renombrando los logs como foo.log.1foo.log.2... y borrar los más antiguos
Para usarlo sólo hay que modificar los valores de las variables si no son los correctos. Se puede automatizar con el programador de tareas de Windows (bastaría con comentar la línea set PAUSA_AL_FINAL=... para que no se quede la ventana abierta). Y en Windows Vista, naturalmente, requiere que se le asignen al ejecutarlo privilegios de administrador.






Comentarios

Entradas populares