Apache Tomcat: сжатие и ротация логов в Windows

Проблема размера логов Apache 2 (httpd) и Apache Tomcat в Windows имеет место быть. В 2026 году на справляющемся с нагрузками железе получать ежедневно +10GB в виде localhost_access_log.YYYY-MM-DD.txt с репозитория на 15 тысяч заглавий — это реальность.
Да можно резать глубину логов, их уровень, удалять или отключать их, но это и статистика и аналитика и просто то, что довольно легко можно сохранить.

Ротируются (создаются каждый день новые файлы) логи сами, если не настроено иное, а ниже будет описан пример bat файла для сжатия логов Apache Tomcat9 в операционной системе Windows посредством архиватора 7-Zip:

@echo off
setlocal enabledelayedexpansion

:: ================= CONFIGURATION =================

:: Путь к папке с логами Tomcat
set "LOG_DIR=C:\RUNTIME\TOMCAT\logs"

:: Путь к исполняемому файлу 7-Zip

set "ZIP_EXE=C:\Program Files\7-Zip\7z.exe"

:: Уровень сжатия (1 - самый быстрый, 5 - нормальный, 9 - максимальный)

set "COMPRESSION_LEVEL=1"
:: =================================================

:: Получаем текущую дату в формате YYYY-MM-DD

for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a"
set "current_date=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%"

:: Формируем имена сегодняшних файлов, которые НЕЛЬЗЯ трогать

set "today_txt=localhost_access_log.%current_date%.txt"
set "today_log=localhost.%current_date%.log"

:: Переходим в папку с логами. Если папка не существует, выходим.

cd /d "%LOG_DIR%" || exit /b

:: Проверяем, существует ли архиватор по указанному пути

if not exist "%ZIP_EXE%" (
    echo Error: 7-Zip not found at "%ZIP_EXE%"
    exit /b 1
)

:: 1. Обработка файлов localhost_access_log.*.txt

for %%i in (localhost_access_log.*.txt) do (
    if /i "%%i" NEQ "%today_txt%" (
        "%ZIP_EXE%" a -tgzip -mx=%COMPRESSION_LEVEL% -sdel "%%i.gz" "%%i"
    )
)

:: 2. Обработка файлов localhost.*.log

for %%i in (localhost.*.log) do (
    if /i "%%i" NEQ "%today_log%" (
        "%ZIP_EXE%" a -tgzip -mx=%COMPRESSION_LEVEL% -sdel "%%i.gz" "%%i"
    )
)

Жмет такой батник только localhost_access_log.YYYY-MM-DD.txt и localhost.YYY-MM-DD.log в папке, указанной в LOG_DIR архиватором из пути, указанного в ZIP_EXE со степенью сжатия, указанной в COMPRESSION_LEVEL. Жмутся все не сегодняшние файлы.

Если нужно жать stderr или что-то еще — это уже дело техники. Какой-то AI-ассистент этот мой скрипт проверил и добавил в него комментарии, в остальном же, код человечий и наверняка не лишен каких-то проблем. Например, не знаю что произойдёт при повторном запуске после падения (при наличии временных файлов 7-Zip), ну и wmic требует права администратора. С date я не справился.

Наверняка в сети есть готовые решения, более изящные и универсальные, но я чего-то не нашел. Обидно будет, если сервисы сами свои логи жать умеют… но в линуксе они вроде не сами, им там помогают.

Формат GZ использован исключительно для однотипности с «линуксовыми» логами и для совместимости с используемым мной анализатором логов. Уровень сжатия обусловлен чахлостью сервера для которого решалась проблема. Никто не мешает жать в 7z с уровнем 9.

Запись опубликована в рубрике Работа с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *