У меня есть длительный процесс, который записывает свой файл журнала в stdout
. Я хотел бы сохранить этот вывод в разные файлы, автоматически поддерживать эти файлы (например, удалять / архивировать старые) без перезапуска основного процесса.
Решением было бы отправить вывод в файл (process > log.txt
) и используйте logrotate
на нем, но logrotate
необходимо перезапустить программу, что невозможно.
Другой - направить вывод на cronolog
(process | cronolog
), но в этом случае старые файлы не будут удалены / заархивированы, что означает, что мне нужно создать программу, которая будет выполнять обслуживание за меня.
Лучше всего иметь возможность использовать обе утилиты, потому что с cronolog
Мне не нужно перезапускать процесс, и logrotate
буду поддерживать старые файлы журналов именно так, как я хочу. Есть ли способ заставить эти две программы работать друг с другом? Если нет, то как лучше решить эту проблему?
Мультилог от DJB DAEMON Tools может сделать (почти) именно то, о чем вы просите. Единственный недостаток, о котором я знаю, это то, что не во многих дистрибутивах есть пакет для DAEMON Tools.
Если вы не управляете своим приложением с помощью svc
(часть daemontools) вам нужно будет найти способ передать вывод в команду типа
multilog t s1048576 n100 ./my_log_directory
Это означает:
t
: вставить метку времени tai64n (которую можно перевести в удобочитаемое время с помощью tai64nlocal
)s1048576
: повернуть файл журнала, когда он вырастет до 1 МБn100
: хранить не более 100 повернутых файлов./my_log_directory
: все, что начинается с .
или /
- записать журнал в этот каталогЗаписываемый журнал будет иметь имя файла current
, и когда multilog вращает журнал, он будет переименован в @<tai64n timestamp>.s
где имя файла показывает время, когда файл был повернут. Расширение может быть .s
если файл был благополучно очищен, или .u
если он мог быть усечен.
Для получения дополнительной информации просто проверьте ссылки.