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:

  1. Detener Apache
  2. Mover los logs recientes
  3. Iniciar Apache
  4. Comprimir los logs movidos
  5. 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.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies