пятница, октября 15, 2010

Как держать логи в чистоте

Встала задача - ежемесячно "подчищать за собой" в папке логов: переносить в архив старые лог-файлы. Ситуация усугубляется тем, что целевая система - Windows. Если в *nix-подобных системах shell достаточно продвинутая, то в Windows приходится использовать дополнительные инструменты.

И так. Понадобится 7-zip (или другой архиватор на личный вкус) и утилита date (из пакета CoreUtil), так любезно портированная с GNU утилит.

При таком минимальном наборе можно уже жить и автоматизировать процесс.

Предусловие:
Пусть файлы утилит находятся по следующим путям: c:\Program Files\7-Zip\7z.exe и C:\tools\date.exe.

и файлы логов имеют формат logfilename-YYYY-MM-DD.log

Что требуется от автоматического скрипта? Чтобы он собрал все файлы за предыдущий месяц в архив и дал соответствующее название архиву. В моём случае имя архива выглядит так: logfilename.logs.till.YYYYMMDD.7z

Сам скрипт:

@echo off

REM Make pattern. Assume that we want to collect all the files of previous month.
FOR /F "usebackq" %%p IN (`C:\tools\date.exe +"*%%Y-%%m-*" -d"-1 month"`) DO SET PATTERN=%%p
REM Obtain the first day of current month for future calculation
FOR /F "usebackq delims=" %%f IN (`C:\tools\date.exe +"%%Y-%%m-01 -1 day"`) DO SET FIRST_DAY="%%f"
REM Obtain the last date of previous month to name logs archive
FOR /F "usebackq" %%l IN (`C:\tools\date.exe +"%%Y%%m%%d" -d%FIRST_DAY%`) DO SET LAST_DAY=%%l

cd %1
REM Perform archiving
"c:\Program Files\7-Zip\7z.exe" a "%2.logs.till.%LAST_DAY%.7z" -i!"%PATTERN%" -mx9 -ms -mmt -y

REM Removing compressed files
ERASE /F /Q %PATTERN%


Полученный скрипт принимает два параметра:
  1. папка, где находятся файлы логов для обработки
  2. основное имя архива.
и вызывается следующим образом:

archive.cmd c:\util\logs utils

в результате работы скрипта, в папке c:\utils\logs все лог-файлы за предыдущий месяц будут перемещены в архив utils.logs.till.20100930.7z

Осталось добавить вызов полученного скрипта в Windows Scheduller и установить время запуска задачи на первое число каждого месяца. Всё. Папки с лог-файлами теперь не будут катастрофически расти.