Главная mBackup mrotate

mrotate 0.2

Консольная утилита по ротации файлов.

Работает на Windows. Установка не требуется, зависимостей нет.

Распространяется по лицензии GNU GPL 3

ВАЖНО!!! ВЫ ИСПОЛЬЗУЕТЕ ДАННЫЙ ПРОГРАММНЫЙ ПРОДУКТ НА СВОЙ СТРАХ И РИСК!!!

Автор заранее слагает с себя ответственность за весь возможный ущерб, причиненный программой.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

Описание

Программа позволяет ротировать текстовые лог файлы для программ которые сами этого не умеют.

Используется два режима ротации.

  1. В имени архивов используется дата/время, старые файлы удаляются если они старше определенной даты. Используется, в основном, когда программа создает множество файлов, например по дате.

  2. В имени архивов используется индекс. (Обычное поведение logrotate из linux). Т.е. предыдущий файл будет иметь индекс 001, более старший 002 и т.д. При архивации они сдвигаются. Файлы удаляются по превышении индексом заданного числа (количества ротаций). В случае этого режима даты файлов не анализируются. Информация о дате последней ротации хранится в файле статуса. По умолчанию это mrotate.status. Можно задать другой файл через параметр командной строки.

Режимы определяются автоматически, в зависимости от настроек Period и Size. Если Period задается числом, используется первый режим. В остальных случаях используется второй (когда Period равен Daily, Weekly или Monthly, или когда указан размер файла). Тем не менее вы всегда можете задать нужный вам режим вручную указав shift=no для первого режима и shift=yes для второго.

Настройки ротации задаются через текстовые конфигурационные файлы формата ini. (Так же можно использовать формат в java-стиле). Файл конфигурации по умолчанию mrotate.ini.

Общая схема использования такая: пропишите настройки ротаций в файле mrotate.ini и добавьте в планировщик ежедневный запуск mrotate.exe /r

Опции запуска

/help, /h

Отобразить список доступных ключей

/rotate, /r

Запустить процесс ротации для всех загруженных настроек ротации

/verify, /v

Проверить настройки ротации

/debug, /d

Эмуляция работы, файлы при этом не обрабатываются. Вы увидите что произойдет, если запустить программу с параметром /r

/force, /f

Принудительный запуск ротации, только для записей с shift=yes

/conf=file, /c=file

Загрузить указанный файл с настройками ротации, параметр можно указывать несколько раз. Если параметр указан файл mrotate.ini не загружается

/arh=file, /a=file

Загрузить настройки правил архивации из указанного файла, параметр можно указывать несколько раз. Кроме указанных всегда обрабатывается файл archivers.ini

/status=file, /s=file

Использовать указанный файл статусов ротации вместо умолчательного

Формат файла конфигурации

Файл с конфигурацией содержит настройки ротации (обычный формат ini). Если что-то нужно написать по русски, используйте кодировку UTF-8

Общий формат файла:

[Имя_записи1]
Параметры
[Имя_записи2]
Параметры

При изменении имени записи может потеряться информация о дате последней ротации и произойти внеочередная ротация. Тоже самое при изменении имени файла настроек. (Только при режиме shift)

Описание параметров

Source

Каталог и маска ротируемых файлов

Recurse

Рекурсивно обрабатывать подкаталоги, по умолчанию no. Если указан yes, для архивов в TargetDir будут создаваться подкаталоги для хранения.

Shift

Режим работы аналогичный logrotate из linux - т.е. файлы имеют индекс, и сдвигаются. По умолчанию отключен. При указании данного режима имя файла должно быть постоянным и не изменятся.

Period
  • Если указано число, то файл будет ротироваться, если его дата из параметра DateMode старше указанного числа дней. Используется первый режим ротации

  • Если указан период, используется второй режим ротации (проверяется только первая буква):

    Daily

    Ежедневно.

    Weekly

    Еженедельно. Обычно по понедельникам

    Monthly

    Ежемесячно. Обычно 1-го числа месяца

Size

Обрабатывать все файлы больше указанного размера в байтах, возможно использование букв K,M. Если параметр Period указан, то он имеет более высокий приоритет и размеры файлов не проверяются. По умолчанию - 0. Если указан, используется второй режим ротации, что можно изменить параметром shift.

Compress

Cжимать файлы указанным правилом архивации или не сжимать ("no") - будет простое переименование

TargetDir

Каталог размещения старых файлов, если не указан то архивные файлы создаются рядом с оригиналами

TargetMask

Маска наименования архивов, к ней всегда добавляется расширение архиватора.

Для режима ротации 1

По умолчанию %FileName. Может также содержать параметры даты времени, которые заменятся на дату/время заданную параметром DateReplace. Если имя не уникально, то в архиве окажется несколько файлов.

Для режима ротации 2 (shift)

По умолчанию %FileName.%Index. Должна обязательно содержать параметр %Index. Может содержать параметры даты/времени, но для любой даты они должны иметь одинаковую длину. Т.е допустимо например указать %FileBaseName.%y%m%d-%H%M.%Index и недопустимо %FileBaseName.%y-%B-%d-%H%M.%Index т.к. %B (полное имя месяца) может иметь разную длину. Параметры даты/времени всегда заменяются на дату/время заданную параметром DateReplace.

Keep

Сколько дней хранить старые файлы, аналог Period, если не указан, то вечно. При режиме shift это количество хранимых ротаций

DateMode

Какую дату брать у файлов, по умолчанию Last.
Используется только при выключенном режиме shift. Обращайте внимание на даты файлов, они могут быть не такими как вы ожидаете!
Возможны (сверяется только первая буква):

Modify

дата модификации файла

Created

дата создания файла

Last

самая поздняя из дат создания и модификации. Т.е. дата наиболее близкая к текущей

First

самая ранняя из дат создания и модификации.

DateReplace

Дата на замену в параметрах даты (типа %d), по умолчанию Now - текущая, возможны так же Modify, Created, Last, First (см. параметр DateMode, проверяется только первая буква).

Prerotate

Скрипт перед ротацией, выполняется один раз для всей записи

Postrotate

Скрипт после ротации, выполняется один раз для всей записи

Архивация

Архивация производится внешним архиватором, он должен находится в путях %Path% или в текущем каталоге. Имя правила архивации указывается в параметре compress. (Этот параметр обязателен)

В программу зашиты следующие правила архивации:

Название Описание Команда запуска

no

Простое переименование файлов

нет

7z

Архивация в контейнер 7z по алгоритму PPMD (для текстовых файлов)

7z.exe a %ArhFileName %FullFileName -m0=PPMd

7zLzma

Архивация 7z по алгоритму LZMA

7z.exe a %ArhFileName %FullFileName

rar

Архивация rar

rar.exe a %ArhFileName %FullFileName

WinRar

Архивация WinRar

winrar.exe a %ArhFileName %FullFileName

Добавить свои правила архивации можно создав файл archivers.ini, примерно такого содержания:

; Имя раздела это имя архиватора
; Имя должно быть уникальным. Если укажете имя зашитое в программу, оно переопределится.
[7zlzma2]
; Имя исполняемого файла, без указания пути
;(хотя допустимо указать и полный путь, но при этом не будет происходить поиск в Path)
ExeName=7z.exe
; Расширение файла архива
Extension=.7z
; Аргументы архиватора, делятся по пробелам, кавычки не сработают!
; Вместо имени файла подставляем %FullFileName, вместо имени архива %ArhFileName
Args=a %ArhFileName %FullFileName -m0=LZMA2

После этого в параметре compress можно использовать 7zLzma2, файлы будут сжиматься по алгоритму Lzma2

Примеры настроек

Пример 1. Файл test.txt ротируется ежедневно, производится архивация с удалением исходного файла в test.txt.001.7z, test.txt.002.7z,… Хранится 10 последних ротаций
[VerySimple]
Source=D:\temp\rotate\test.txt
Period=Daily
Compress=7z
Keep=10
Пример 2. Обрабатываются все файлы *.log в d:\temp\rotate и подкаталогах, у которых дата создания старше 35 дней. Они упаковываются в архивы 7z с именем ГодМесяц.7z, после чего удаляются. Причем в одном архиве хранятся все файлы за месяц (дата создания в пределах месяца). Архивы старше 180 дней удаляются.
[Simple]
Source=d:\temp\rotate\*.log
recurse=yes
Period=35
Сompress=7z
TargetDir=d:\temp\rotateold
TargetMask=%Y%m
Keep=180
dateReplace=Create
DateMode=Create
Пример 3. Просто удаляются все файлы *.txt в d:\temp\rotate и подкаталогах, у которых дата старше 90 дней.
[SimpleDelete]
Source=d:\temp\rotate\*.txt
recurse=yes
compress=no
Keep=90
Пример 4. Обрабатываются все файлы *.log в d:\temp\rotate и подкаталогах, у которых размер больше 100 Кб. Они упаковываются в архивы 7z с именем Имя_файла.Индекс.7z (test.log.001.7z, test.log.002.7z…), после чего удаляются. Будет хранится 10 последних ротаций (Keep=10).
[ShiftExample]
Source=d:\temp\rotate\*.log
Size=100K
compress=7z
TargetDir=d:\temp\rotateold
Keep=10
Пример 5. Обрабатываются все файлы *.log в d:\temp\rotate, у которых размер больше 100 Кб. Они упаковываются в архивы 7z с именем ИмяФайлаГодМесяцДата.7z (дата - это дата ротации, например test.log.20111101.7z, test.log.20111102.7z…), после чего удаляются. Архивы хранятся 180 дней.
[DateExample]
Source=d:\temp\rotate\*.log
Shift=no
Size=100K
compress=7z
TargetDir=d:\temp\rotateold
TargetMask=%FileName%Y%m%d
Keep=180
Пример 6. Обрабатываются все файлы *.log в d:\temp\rotate. Они ежедневно упаковываются в архивы 7z с именем имя_файла.Индекс.7z (test.log.001.7z, test.log.002.7z…), после чего удаляются. Будет хранится 10 последних ротаций (Keep=10).
[ShiftDailyExample]
Source=d:\temp\rotate\*.log
Period=Daily
compress=7z
TargetDir=d:\temp\rotateold
Keep=10
Пример 7. Обрабатываются все файлы *.log в d:\temp\rotate. Они каждые 8 дней упаковываются в архивы 7z с именем имя_файла.Индекс.7z (test.log.001.7z, test.log.002.7z…), после чего удаляются. Будет хранится 10 последних ротаций (Keep=10).
[ShiftOutsizeExample]
Source=d:\temp\rotate\*.log
Shift=yes
Period=8
compress=7z
TargetDir=d:\temp\rotateold
Keep=10

Вывод сообщений в файл

По умолчанию все сообщения выводятся на консоль. Перенаправление вывода в файл (> log.txt) не сработает (стандартный поток вывода не используется). Если необходима запись сообщений в файл, создайте секцию logging в файле mrotate.ini

[logging]
; Лог ведется на консоль и в файл
formatters.f1.class = PatternFormatter
formatters.f1.pattern =%Y-%m-%d %H:%M:%S [%p] %t
formatters.f1.times = local

channels.c1.class = ConsoleChannel

channels.c2.class = FileChannel
channels.c2.path = mrotate.log
channels.c2.formatter = f1

; Ротация по размеру
channels.c2.rotation = 5M
; Хранить 5 последних логов
channels.c2.purgeCount=5
; Логи можно сжимать gzip
;channels.c2.compress=true
; Или возможна ротация по периодам
;channels.c2.rotation = weekly


channels.croot.class = SplitterChannel
channels.croot.channels = c1,c2

loggers.root.channel = croot
loggers.root.level = information

Можно использовать любые настройки логгирования из Poco.

Формат в java-стиле

Вместо формата .ini возможно испльзовать формат в java-стиле. Для этого указываем расширение .properties вместо ini. Пример в этом формате будет выглядеть так:

Пример 8. Обрабатываются все файлы *.log в d:\temp\rotate и подкаталогах, у которых размер больше 100 Кб. Они упаковываются в архивы 7z с именем ИмяФайлаГодМесяцДата.7z (дата - это дата ротации, например test.log.20111101.7z, test.log.20111102.7z…), после чего удаляются. Архивы хранятся 180 дней.
# Это комментарий
DateExample.Source=d:\temp\rotate\*.log
DateExample.Shift=no
DateExample.Size=100K
DateExample.Compress=7z
DateExample.TargetDir=d:\temp\rotateold
DateExample.TargetMask=%FileName%Y%m%d
DateExample.Keep=180

Регистр названий здесь важен, в отличие от ini. Т.е. запись DateExample.keep=180 не прочитается.

Ссылки

Использована библиотека Poco. http://pocoproject.org

Архиватор 7-zip можно бесплатно скачать на http://7-zip.org/

Контакты

Вопросы, предложения, замечания принимаются по адресу atsave@narod.ru
Сайт программы: http://atsave.narod.ru

Приложение

Допустимые параметры в targetMask

Имена файлов

%FileName      Имя файла
%FileBaseName  Имя файла без расширения
%FileExt       Расширение файла (без точки)
%Index         Индекс файла, только при режиме shift

Дата/время

%w - abbreviated weekday (Mon, Tue, ...)
%W - full weekday (Monday, Tuesday, ...)
%b - abbreviated month (Jan, Feb, ...)
%B - full month (January, February, ...)
%d - zero-padded day of month (01 .. 31)
%e - day of month (1 .. 31)
%f - space-padded day of month ( 1 .. 31)
%m - zero-padded month (01 .. 12)
%n - month (1 .. 12)
%o - space-padded month ( 1 .. 12)
%y - year without century (70)
%Y - year with century (1970)
%H - hour (00 .. 23)
%h - hour (00 .. 12)
%a - am/pm
%A - AM/PM
%M - minute (00 .. 59)
%S - second (00 .. 59)
%s - seconds and microseconds (equivalent to %S.%F)
%i - millisecond (000 .. 999)
%c - centisecond (0 .. 9)
%F - fractional seconds/microseconds (000000 - 999999)
%z - time zone differential in ISO 8601 format (Z or +NN.NN)
%Z - time zone differential in RFC format (GMT or +NNNN)
%% - percent sign (Реально может и не сработать, например если написать %%FileName - получится %ИмяФайла)
 Andrey Kapustin © 2009-2013 atsave@narod.ru