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.