Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

архивация логов

#linux #логирование


есть каталог /var/log.

как с помощью с скрипта заархивировать логи старше, чем вчера, в папку /var/log/archive?

логи имеют формат yyyy_mm_dd_name.log
    


Ответы

Ответ 1



главные трудности, видимо, следующие: отобрать только те файлы в текущем каталоге, имена которых соответствуют шаблону yyyy_mm_dd_name.log, где name — произвольный набор символов, не содержащий символа _ исключить из отобранных те файлы, в именах которых часть yyyy_mm_dd соответствует сегодняшней или вчерашней дате что-то сделать с найденными файлами (например, переместить куда-нибудь) решение: отобрать в текущем каталоге такие файлы можно, например, так: $ find -maxdepth 1 -regextype posix-basic -regex "\./[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[^_]\+\.log" проверим, создав тестовые файлы (один содержит сегодняшнюю дату, один — вчерашнюю, один — позавчерашнюю, и один, контрольный, не содержит даты в имени): $ touch 2016_07_04_some.log 2016_07_03_some.log 2016_07_02_some.log some.file $ find -maxdepth 1 -regextype posix-basic -regex "\./[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[^_]\+\.log" ./2016_07_03_some.log ./2016_07_04_some.log ./2016_07_02_some.log вроде, правильно. чтобы исключить файлы, в имени которых содержится сегодняшняя или вчерашняя дата, надо добавить к опциям программы find такую примерно конструкцию: \! -regex "\./2016_07_04_[^_]\+\.log" \! -regex "\./2016_07_03_[^_]\+\.log" тогда в вывод попадает только позавчерашний файл: ./2016_07_02_some.log но завтра ведь даты будут другие. как привязаться к текущему дню? с помощью программы date, например. сегодняшняя дата: $ date +'%Y_%m_%d' 2016_07_04 и вчерашняя: $ date -d 'day ago' +'%Y_%m_%d' 2016_07_03 заключаем вызовы date в «операторные скобки» $(...), подставляем в нужные места, и получаем длинную команду: $ find -maxdepth 1 -regextype posix-basic -regex "\./[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[^_]\+\.log" \! -regex "\./$(date +'%Y_%m_%d')_[^_]\+\.log" \! -regex "\./$(date -d 'day ago' +'%Y_%m_%d')_[^_]\+\.log" ./2016_07_02_some.log для того, чтобы переместить найденные программой find файлы в каталог, например, /var/log/archive, можно добавить к опциям той же программы такую, например, конструкцию: -exec mv {} /var/log/archive \; итого полный текст команды будет таким: $ find -maxdepth 1 -regextype posix-basic \ -regex "\./[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[^_]\+\.log" \ \! -regex "\./$(date +'%Y_%m_%d')_[^_]\+\.log" \ \! -regex "\./$(date -d 'day ago' +'%Y_%m_%d')_[^_]\+\.log" \ -exec mv {} /var/log/archive \; он разбит на строки исключительно для удобства обзора. если вставлять этот текст в одну строку, то последний в каждой строке символ \ надо удалить.

Ответ 2



Не нужно писать собственное решение, когда уже есть различные готовые. Автоматическая ротация и архивация логов Решение называется logrotate. Предположим, вы хотите ротировать и архивировать логи приложения name Конфигурация в файле /etc/logrotate.d/name: /var/log/*name.log { daily # ежедневно olddir /var/log/archive # перемещать в другую папку missingok # не создавать сообщение об ошибке, если лог пустой } Logrotate исключает необходимость приложению самостоятельно записывать дату в имя файла. Приложение может писать логи в один и тот же файл, который в момент ротации будет заменяться на новый. Если приложение самостоятельно не переоткрывает файл при записи каждой новой строки, то будет полезна опция copytruncate. С ней logrotate не пересоздает файлы логов, а вырезает содержимое и пишет его в новый файл. /var/log/*name.log { ... copytruncate } copytruncate Truncate the original log file in place after creating a copy, instead of moving the old log file and optionally creating a new one, It can be used when some program can not be told to close its logfile and thus might continue writing (appending) to the previous log file forever. Если по соображениям места на диске или полезности вы хотите хранить логи за последние N периодов ротации, то добавьте опцию rotate N. Например, за последнюю неделю: /var/log/*name.log { ... daily rotate 7 } Централизованное хранение логов. Хранить важные логи прямо на хосте - это плохо, и вот почему: Там может быть недостаточно места. У меня был случай, когда логи заняли всё место и парализовали хост (к счастью, тестовый). Если всё совсем сломается, то логи будут очень нужны, а вы на них не посмотрите. Читать логи в текстовом редакторе или анализировать grep'ом - неэффективно. У этого способа масштабируемость хуже линейной. То есть чтобы следить за логами на вдвое большем количестве хостов вам понадобится более чем вдвое больше ресурсов (человекочасов и т.п.). Логи должны храниться централизованно и в базе данных. Тогда: Вы можете получать оперативную аналитику Вы можете легко сравнивать логи между разными хостами, приложениями, периодами времени В случае поломки все или почти все логи будут вам доступны Масштабируемость примерно логарифмическая. Есть ряд решений, одно из них - стек ELK (Elasticsearch, Logstash, Kibana). Возможно, в данный момент для ваших задач достаточно простой ротации. Но, пожалуйста, ориентируйтесь на централизованное хранение.

Комментариев нет:

Отправить комментарий