3

У меня есть собственный класс ведения журнала, который создает журнал для каждого экземпляра процесса и добавляет уникальный идентификатор к имени файла журнала, например:

  • process.1234.log
  • process.1235.log

Также я могу добавить отметку даты / времени, например:

  • process.1234.03012012.log
  • process.1235.03012012.log

Может ли LogRotate использовать регулярные выражения, чтобы я мог архивировать свои файлы журналов по дате и / или идентификатору процесса?

1 ответ1

5

Я не знаю, есть ли более поздние версии, но после дальнейших исследований я обнаружил, что подстановочные знаки оболочки поддерживаются. Оба * (соответствуют нескольким символам) и ? (соответствует одному символу) можно комбинировать для соответствия конкретным файлам.

В качестве примера, здесь приведены шаблоны, которые соответствуют вашему варианту использования вместе с остальной частью файла, который можно найти в /etc/logrotate.d/process

/path/to/my/logfiles/process.????.????????.log
/path/to/my/logfiles/process.????.log
{

    # Look for previously matched log files and rotate daily if found
    daily

    # use date as a suffix of the rotated file
    dateext

    # Compress log file, optional if the files are small enough
    compress

    # Allow for a log file pattern to NOT match in order to support both
    # filename formats
    missingok

    # Do not create replacement log files, the application will do that
    nocreate

    # Keep 30 days worth of rotated logs
    maxage 30
}

Однако, если вы намеревались, чтобы process был заполнителем для фактического идентификатора процесса, то я считаю, что вы можете избежать использования подстановочного знака вместо идентификатора процесса, например так:

/path/to/my/logfiles/*.????.????????.log
/path/to/my/logfiles/*.????.log
{
    ...
}

Надеюсь, это поможет. Я тоже отправился на поиски подходов регулярных выражений, которые бы сработали, и в итоге решил использовать подстановочные знаки оболочки вместо того, что, по моему мнению, было работоспособным, но более сложным решением.

Пример:

При поиске решения для регулярных выражений я обнаружил запись в блоге под названием « Исключение файлов из совпадений глобализации logrotate », которая предоставила это решение:

/var/log/upstart/*.log {
    daily
    missingok
    rotate 7
    compress
    notifempty
    nocreate
    nosharedscripts
    prerotate
        bash -c "[[ ! $1 =~ testprogram ]]"
    endscript
}

В итоге я вытащил две вещи из этого примера и немного изменил матч. В моей ситуации я хотел повернуть все файлы в каталоге, за исключением некоторых входных файлов с расширением .inp .

Вот что я придумал:

# Force the prerotate "script" below to be run on each individual file
# in order to verify that it isn't an unprocessed input file
nosharedscripts

# Skip rotating any unprocessed input files (*.inp extension)
prerotate
   bash -c "[[ ! $1 =~ \.inp$ ]]"
endscript

Согласно logrotate -d /etc/logrotate.d/myfilename это работает. Однако, как я уже упоминал, я выбрал подход с использованием подстановочных знаков оболочки, так как кому-то, идущему за мной, было проще поддерживать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .