Ротация логов в linux и freebsd с помощью logrotate

Опции общего назначения:

extention расширение Лог-файлы с указанным расширением могут сохранять его после ротации. Если используется компрессия, то расширение с типом архива (обычно .gz) появляется после расширения. Например, если у вас файл лога называется mylog.foo и вы хотите получить при ротации файл mylog.1.foo.gz, а не mylog.foo.1.gz
rotate количество Лог-файлы ротируются указанное количество раз до удаления или отправки на адрес, указанный в директиве mail. Если количество равно 0, старые версии просто удаляются вместо ротации.
start номер Указать номер, используемый как база для нумерации при ротации. Например, если вы указываете 0, то оригинальный файл будет ротироваться в файл с окончанием .0, и далее по увеличению, если указать 9, то нумерация начнется с .9. Файлы в любом случае будут ротироваться такое количество раз, которое указано в директиве count.
su пользователь группа Выполнять ротацию логов под указанным пользователем и группой вместо пользователя по умолчанию (обычно root). Если у пользователи или группы недостаточно прав для осуществления ротации, возникнет ошибка.
include файл-или-директория logrotate считывает указанный файл и вставляет его как есть в конфигурационный файл в место вставки директивы include. Если указана директория, файлы из нее сортируются по алфавиту и затем вставляются в конфигурацию. При этом, если файлы не являются обычными файлами, они игнорируются. Это могут быть, например, именованные пайпы или директории. Также игнорируются файлы, имеющие расширения, указанные в директории tabooext.
tabooext список Изменение текущего списка игнорируемых расширений. Если перед списком стоит +, то текущий список дополняется указанным. Если + не указан, то список заменяется. По умолчанию список изначально включает следующие расширения: .rpmsave, .rpmorig, ~, .disabled, .dpkg-old, .dpkg-dist, .dpkg-new, .cfsaved, .ucf-old, .ucf-dist, .ucf-new, .rpmnew, .swp, .cfsaved, .rhn-cfg-tmp-*

И напоследок простой пример.

/var/log/mydaemon/mydaemon.log /var/log/mydaemon/error.log{
    # Ежедневная ротация
    daily
    # Начинать нумерацию с 0
    start 0
    # Ротировать 30 раз до удаления
    rotate 30
    # Не генерировать ошибку, если файла лога нет
    missingok
    # Удалять логи при помощи команды shred
    shred
    # Делать 3 цикла перезаписи
    shredcycles 3
    # Отложить сжатие последнего лога
    delaycompress
    # Выполнять postrotate только один раз
    sharedscripts
    # После ротации послать программе сигнал SIGHUP, в результате чего
    # будут переоткрыты дескрипторы логов
    # (многие программы поддерживают такое поведение)
    postrotate
        kill -SIGHUP $(cat /var/run/mydaemon.pid)
    endscript
}

Если вы раньше не пользовались программой logrotate или пользовались, но никогда не настраивали тонко под себя, надеюсь эта информация вам поможет.

Автоматический запуск

Задание на автоматический запуск создается по умолчанию в файле /etc/cron.daily/logrotate. Если изучить его содержимое, мы увидим, что идет запуск logrotate, который читает все файлы в директории /etc/logrotate.d/ и выполняющий для каждого из них ротацию.

Если для какого-то приложения необходимо выполнять ротацию лога по особому расписанию, узнаем полный путь до утилиты logrotate:

which logrotate

* в моем случае, это было /usr/sbin/logrotate.

Получив путь, создаем правило в cron:

crontab -e

0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/logstash

* в данном примере в 00:00 будет запускаться logrotate и чистить логи с нашей настройкой для logstash-forwarder.

или запуск чистки всех логов:

0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.conf

Как работает Logrotate?

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

Проверку условий можно настроить ежедневно, еженедельно или ежемесячно. Это позволяет создать схему ротации логов, удобную именно для вас и вашего сервера. Также ротация логов может быть полезна на домашнем компьютере, но здесь она не так важна как на серверах, где только в логи Apache могут записываться до сотен тысяч строк ежедневно.

Опции, связанные с размером и существованием файла лога:

maxsize размер Лог ротируется, когда его размер превысит указанный, еще до наступления следующего интервала ротации (daily, weekly, monthly, yearly). Поскольку такая ротация не зависит от времени, поэтому использовать в названии файла дату не имеет смысла.
minsize размер Лог ротируется, когда его размер больше указанного, но не ранее, чем наступает соответствующий временной интервал ротации (daily, weekly, monthly, yearly)
size размер Лог ротируется, когда его размер больше указанного количества байт. Если после размера указана буква k, размер считается в килобайтах, если M — в мегабайтах, если G — в гигабайтах. Например, 1G или 10M.
ifempty Ротировать файл лога, даже если он пуст. Используется по умолчанию.
notifempty Не ротировать файл лога, если он пуст. Перегружает опцию ifempty.
missingok Если файл лога отсутствует, перейти к следующему без сообщения об ошибке
nomissingok Если файл лога отсутствует, возникнет ошибка. Этот параметр установлен по умолчанию.

Для самых маленьких: ротация логов и с чем ее едят

Опять одиноко, хоть и хорошо провел вторую половину дня…

Сегодня мы поговорим о том что такое ротация логов, с чем ее едят и насколько она вкусна. Ротация — процесс обновления чего‐то, круговорот чего‐то. Но что такое ротация логов?

Ротация логов — это процесс архивирования логов, удаление старых логов и все из этого вытекающее. Оно нужно для того, чтобы внезапно у вас не забилось все место на HDD/SSD различными логами, ну, а так же для того, чтобы не было слишком много одинаковых и очень больших лог‐файлов. При ротации логов происходит несколько вещей:

  • Файл журнала архивируется и сохраняется под именем log.log.0
  • Более старые логи переименовываются (log, log,0 в log.log.1 и т.д.)
  • Самые старые логи удаляются
  • Очищается «главный» файл лога
  • Перезапускается демон пишуший логи если это необходимо

Порядок всех этих действий может быть произвольным, и зависит от напрямую от реализации утилиты для ротации логов. В linux‐based системах зачастую используется утилита logrotate которая запускается по умолчанию (покрайней мере в ubuntu) кроном раз в день и делает свою грязную работу. В bsd системах, насколько мне известно, используется newsyslog для той же самой работы, но т.к. freebsd я видел всего несколько раз в жизни — ничего полезного я сказать о ней не могу :).

Logrotate имеет свой конфигурационный файл /etc/logrotate.conf в котором описаны глобальные параметры, а так же, подключаются различные дополнительные конфиги из /etc/logrotate.d в которых описаны действия для различных демонов. Например, конфиг nginx выглядит примерно так:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then 
            run-parts /etc/logrotate.d/httpd-prerotate; 
        fi; 
    endscript
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Конфигурационные файлы logrotate человекопонятные. В частности, в этом конфигурационном файле описываются правила для файлов попадающийх под glob‐шаблон /var/log/nginx/*.log:

  • missingok — говорит о том, что если файла нету то все ок
  • daily — проводить ротацию ежедневно
  • rotate X — хранить X файлов
  • compress — сжимать старые файлы
  • delaycompress — не сжимать последний лог
  • notifempty — не архивировать пустые файлы
  • create ACCESS_MODE USER GROUP — с какими правами создавать архивы
  • sharedscripts — какая то фишка для prerotate и postrotate:)
  • prerotate, postrotate — что сделать перед ротацией и после нее.

Что меня побудило написать эту статью? Написать эту статью я решил потому что обнаружил то, что на моих серверах которые я админю логи apache и nginx внезапно стали помещаться в домашнюю директорию пользователя, и имели различные размеры (от пары мегабайт до нескольких гигов), и конечно же ротация логов не была перенастроена, и так вот логами было съедено приличный объем дискового пространства.

Мораль сей басни такова: работает — не трогай, блядь, и все будет работать отлично! А если хочется потрогать — ССЗБ :)

Еще почитать на тему можно тут, тут и тут.

Добра вам! Счастья! Здоровья! :)

2: Конфигурации Logrotate

Подробности конфигурации Logrotate в Ubuntu обычно можно найти в двух местах:

  • /etc/logrotate.conf: этот файл содержит некоторые настройки по умолчанию и устанавливает ротацию нескольких логов, которые не принадлежат никаким системным пакетам. Он также использует оператор include для загрузки конфигурации из каталога /etc/logrotate.d.
  • /etc/logrotate.d: здесь хранятся конфигурации Logrotate для всех установленных пакетов, которые нуждаются в ротации логов. При стандартной установке здесь уже должны быть файлы базовых системных инструментов, таких как apt, dpkg, rsyslog и т. Д.

По умолчанию logrotate.conf будет еженедельно выполнять ротацию логов (weekly) пользователя root и группы syslog (su root syslog), сохранять 4 лог-файла (rotate 4) и создавать новые пустые файлы логов после ротации текущих логов (create).

Откройте конфигурационный файл Logrotate пакета в файле /etc/logrotate.d. Выведите файл пакета apt спомощью команды cat:

Этот файл содержит блоки конфигурации для двух разных логов в каталоге /var/log/apt/ – term.log и history.log. В этих блоках одинаковые опции. Любые параметры, не заданные в этих конфигурационных блоках, принимают значения по умолчанию или значения, установленные в файле /etc/logrotate.conf. Параметры, установленные для логов apt:

  • rotate 12: сохраняет 12 старых логов.
  • monthly: включает ротацию логов раз в месяц.
  • compress: сжимает логи после ротации. По умолчанию он использует gzip, а файлы получают расширение .gz. Команду сжатия можно изменить с помощью опции compresscmd .
  • missingok: не записывает сообщение об ошибке, если файл журнала отсутствует.
  • notifempty: исключает из ротации пустые файлы.

У Logrotate есть еще множество опций конфигурации. Вы можете прочитать обо всех них, в мануале Logrotate, который можно открыть с помощью этой команды:

Пользовательские логи

В предыдущем разделе строка, описывающая access.log, использует не такую директиву, как предыдущие строки для настройки логов. Она использует CustomLog:

Эта директива имеет такой синтаксис:

В данном случае log_format (формат логов) является комбинированным (combined). Эта спецификация не является внутренней спецификацией Apache; она задаёт пользовательский формат, который определен в конфигурационном файле по умолчанию.

Снова откройте конфигурационный файл по умолчанию и найдите строку, определяющую формат combined:

Команда LogFormat определяет пользовательский формат логов, вызываемых директивой CustomLog.

Этот формат называется комбинированным (combined).

Примечание: Подробнее о доступных форматах можно узнать .

Существует еще несколько распространённых форматов, которые можно использовать в определении виртуальных хостов. Можно также создавать свои собственные форматы.

Определение версии LogRotate

Если вы используете не-Ubuntu сервер, сначала убедитесь, что Logrotate установлен, попросив его информацию о версии:

logrotate --version

Вывод

logrotate 3.8.7

Если Logrotate не установлен, вы получите сообщение об ошибке. Пожалуйста, установите программное обеспечение с помощью менеджера пакетов вашего дистрибутива Linux.

Если установлен Logrotate, но номер версии существенно отличается, то может возникнуть проблемы с конфигурацией, описанной в этом руководстве. Обратитесь к документации по вашей конкретной версии LogRotate, прочитав страницу man:

man logrotate

Далее мы рассмотрим структуру конфигурации LogRotate по умолчанию на Ubuntu.

Опции копирования:

copy Копировать лог-файл, но не изменять оригинал. Эту опцию можно использовать, когда надо создать снимок лога на определенный момент, вместо ротации, либо когда для усечения лога используется внешняя программа. Если используется опция copy, то опция create, если она указана, не будет иметь никакого эффекта, так как старый лог остается.
copytruncate Урезать оригинальный файл до нулевого размера после создания копии вместо переименования оригинального файла и создания нового. Эта опция используется тогда, когда программе, записывающей лог, нельзя указать, что нужно закрыть связанный с файлом лога дескриптор и открыть новый. Такая программа может продолжать писать в старый файл. При использовании этой опции есть один момент, связанный с тем, что на копирование требуется некоторое время и поэтому файл не может быть скопирован мгновенно. За время копирования в лог могут быть добавлены записи, которые будут утеряны при усечении файла до нулевого размера. При использовании этой опции опция create также не будет иметь эффекта, так как старый файл остается на месте
nocopy Не копировать оригинальный лог-файл. Эта опция перегружает опцию copy
nocopytruncate Не усекать оригинальный лог-файл после создания копии. Эта опция перегружает опцию copytruncate

Создайте образец файла конфигурации logrotate

Предположим, что у нас есть приложение, работающее как пользователь linuxtechi, которое генерирует файлы журналов, которые хранятся в /home/linuxtechi/logs . Нам нужно настроить ротацию файлов журналов на еженедельной основе.

Но сначала мы собираемся создать файл конфигурации logrotate в домашнем каталоге, как показано:

$ vim /home/linuxtechi/logrotate.conf

Затем мы собираемся вставить показанную конфигурацию:

/home/linuxtechi/logs/*.log {
    weekly
    missingok
    rotate 14
    compress
    create
}

Давайте поместим это в контекст:

Файлы журнала будут обновляться еженедельно, с подавлением сообщений об ошибках, если какой-либо из файлов журнала отсутствует. В течение месяца будет выполнено резервное копирование 14 файлов журнала с созданием нового файла журнала после ротации текущего файла журнала.

Теперь мы собираемся создать каталог журналов, который будет содержать файлы журналов приложения, а затем создать файл журнала с именем app.log.

:~$ mkdir logs && cd logs
:~/logs$ touch app.log
:~/logs$ ls
app.log
:~/logs$

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

$ logrotate /home/linuxtechi/logrotate.conf --state /home/linuxtechi/logrotate-state --verbose

Вы получите примерно такой результат:

Судя по выходным данным, файл журнала не менялся по той простой причине, что ротация происходит еженедельно, а возраст файла журнала составляет всего час.

Изучите файл logrotate, чтобы убедиться, что была записана какая-либо информация о запуске ротации журнала..

:~$ cat logrotate-state
logrotate state -- version 2
"/home/linuxtechi/logs/app.log" 2020-5-24-17:0:0
:~$

Из выходных данных мы видим, что утилита logrotate подтвердила, когда последний раз рассматривала файл журнала для ротации, и напечатала метку времени.

Теперь мы заставим logrotate повернуть файл журнала — чего в противном случае не было бы сейчас, поскольку указанный интервал времени еще не превышен — используя флаг –force как показано.

$ logrotate /home/linuxtechi/logrotate.conf --state /home/linuxtechi/logrotate-state --verbose --force

Если вы вернетесь в каталог журналов, вы увидите дополнительный файл журнала, который был повернут и сжат, как показано.

:~$ cd logs/
:~/logs$ ls
app.log  app.log.1.gz
:~/logs$

Настройка

Для приложение, ротация логов настраивается в отдельных файлах, расположенных по пути /etc/logrotate.d/ (во FreeBSD — /usr/local/etc/logrotate.d/).

К примеру, нам необходимо настроить ротацию лога для logstash-forwarder. Создаем файл со следующим содержимым:

vi /etc/logrotate.d/logstash

/var/log/logstash-forwarder/* {
    rotate 30
    size=10M
    missingok
    notifempty
    daily
    compress
    delaycompress
    maxage 30
    create 0644 root root
    postrotate
        /usr/bin/systemctl restart logstash-forwarder
    endscript
}

* где:

  • rotate 30 — хранить последние 30 ротированных файлов. Остальные удалять.
  • size=10M — пока размер лог-файла не превысит 10 мегабайт, он не будет ротироваться.
  • missingok — если файла не существует, не выкидывать ошибку.
  • notifempty — если файл пустой, не выполнять никаких действий.
  • daily — делать ротацию каждый день.
  • compress — сжимать ротированные файлы.
  • delaycompress — сжимать только предыдущий журнал. Позволяет избежать ошибок, связанных с отсутствием доступа к используемому файлу.
  • maxage 30 — хранить ротированные файлы за последние 30 дней. Остальные удалять.
  • create 0644 root root — создать новый лог-файл после ротирования.
  • postrotate … endscript — скрипт, который необходимо выполнить после чистки лога.

* /var/log/logstash-forwarder/* — путь к файлу, который нужно ротировать. * указывает, что нужно чистить все файлы, которые расположены в каталоге /var/log/logstash-forwarder.
* напомню, что во FreeBSD, путь будет /usr/local/etc/logrotate.d/logstash.

Другие примеры настройки читайте в инструкции Примеры настроек logrotate для различных программ. 

При настройке необходимо проверять работу сервиса после ротации лога. Некоторые службы могут перестать работать без лог-файла. В данном случае, необходимо создавать новый (create). Также, в некоторых случаях, сервис необходимо перезапускать, так как при создании нового файла меняется его дескриптор.

Понимание логирования

  • Прямая запись: некоторые сервисы записывают информацию напрямую в лог-файлы, даже некоторые важные сервисы, такие как веб-сервер Apache и файловый сервер Samba.
  • rsyslogd: rsyslogd — это усовершенствование сервиса syslogd, который занимается централизованным управлением лог-файлов. Syslogd существует уже давно.
  • journald: с введением systemd также был представлен сервис логирования journald. Этот сервис тесно интегрирован с systemd, что позволяет администраторам читать подробную информацию из journald, одновременно отслеживая состояние сервиса с помощью команды systemctl status.

Как работает Logrotate?

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

Проверку условий можно настроить ежедневно, еженедельно или ежемесячно. Это позволяет создать схему ротации логов, удобную именно для вас и вашего сервера. Также ротация логов может быть полезна на домашнем компьютере, но здесь она не так важна как на серверах, где только в логи Apache могут записываться до сотен тысяч строк ежедневно.

Что такое ротация журналов?

Ротация журналов — это процесс, который создает новые файлы журналов и архивирует и удаляет старые для экономии места на диске. Процесс переименовывает текущий файл журнала. Например, apport.log становится apport.log.1, и создается новый файл журнала apport.log для регистрации новых записей журнала. Старые файлы журналов обычно сжимаются и отображаются как  apport.log.2.gz , apport.log.3.gz , apport.log.4.gz и т. Д.

Процесс ротации журналов упрощается с помощью утилиты logrotate . Это инструмент, который упрощает ротацию файлов журналов, а также архивирование и удаление старых, чтобы освободить место на диске. Таким образом, logrotate выполняет следующее:

  • Создание новых файлов журналов после ротации старых.
  • Архивирование старых файлов журналов.
  • Удаление старых файлов журналов, которые были повернуты для экономии места.

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

Ведение логов в Logrotate

На больших ресурсах журналы могут достигать огромных размеров, поэтому нужно своевременно архивировать или очищать логи. С помощью утилиты Logrotate можно управлять ведением журналов: настроить период ротации (архивирование старого журнала и создание нового), период и количество хранения журналов и многое другое.

Изначально программа отсутствует в системе. Ниже приведены команды для инсталляции Logrotate из официальных репозиториев.

Ubuntu, Debian:

sudo apt install logrotate

CentOS:

sudo yum install logrotate

После установки необходимо проверить путь для будущих конфигурационных файлов. Для правильной работы они должны находится в папке «logrotate.d». Проверить данный параметр можно открыв конфигурационный файл  командой:

nano /etc/logrotate.conf

В директории «RPM packages drop log rotation information into this directory» должна присутствовать строка:

include /etc/logrotate.d

Теперь создаётся конфигурационный файл «rsyslog.conf». В нём будет находиться конфигурацию по работе с логами. Для создания файла в терминале вводится команда:

sudo nano /etc/logrotate.d/rsyslog.conf

В окне терминала откроется текстовой редактор. Теперь нужно внести конфигурацию, как указано в образце. В качестве примера будет использоваться журнал посещений «Access.log» (Nginx).

/var/log/nginx/access.log {
daily
rotate 3
size 500M
compress
delaycompress
}

Теперь остаётся только запустить Logrotate. Для этого вводится команда:

sudo logrotate -d /etc/logrotate.d/rsyslog.conf

Для проверки правильности работы программы в терминале можно ввести команду:

ls /var/cron.daily/

Директивы HttpLogModule

Директива error_log ходит в основной модуль, а access_log (следующая директива, которую стоит рассмотреть) входит в модуль HttpLogModule, который предоставляет возможность настраивать логи.

В этот модуль также включено несколько других директив, помогающих настраивать пользовательские логи.

Директива log_format

Директива log_format описывает формат записи лога при помощи простого текста и переменных.

Формат, который использует Nginx, называется комбинированным. Этот общий формат используется многими серверами. Он имеет следующий вид:

Определение этой директивы охватывает несколько строк и заканчивается точкой с запятой (;).

Фрагменты, которые начинаются с символа $, задают переменные; символы тире и квадратных скобок () воспринимаются буквально.

Общий синтаксис команды:

Директива access_log

Синтаксис директивы access_log похож на синтаксис error_log, но он более гибок. Та директива используется для настройки пользовательских логов.

Базовый синтаксис:

Стандартным форматом директивы access_log является combined (как и в log_format). Можно использовать любой формат, определённый в log_format.

Фрагмент команды buffer_size задаёт максимальный объём данных, которые хранит сервер Nginx, прежде чем внести их в лог. Чтобы настроить сжатие лог-файла, нужно добавить в директиву gzip:

В отличие от error_log, директиву access_log можно просто выключить:

Её вывод не обязательно переводить в /dev/null.

Настройка Logrotate

Logrotate — это популярная утилита, поэтому в большинстве дистрибутивов она поставляется по умолчанию. Вы можете убедиться, что программа установлена в вашем дистрибутиве, попытавшись ее установить. Например, в CentOS:

Или в Ubuntu и основанных на ней дистрибутивах:

Теперь, даже если утилита не была установлена, вы ее установите. Все основные настройки программы находятся в файле /etc/logrotate.conf, дополнительные настройки, касаемо правил и других возможностей могут быть размещены в папке /etc/logroate.d/. Вы можете размещать все настройки logroatae прямо в основном конфигурационном файле, будет более правильно, если настройки для каждого отдельного сервиса будут находиться в отдельном файле, в папке /etc/logrotate.d/.

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

Просто убедитесь что она там уже есть. Сначала давайте рассмотрим основные директивы, которые мы будем применять во время настройки. Здесь директивы выглядят не совсем обычно, сама директива и определяет что и когда нужно делать, а уже если нужно, ей передаются дополнительные параметры. Чтобы указать как часто нужно выполнять проверку совпадению условий используются такие директивы:

  • hourly — каждый час;
  • daily — каждый день;
  • weekly — каждую неделю;
  • monthly — каждый месяц;
  • yearly — каждый год.

Основные директивы управления и обработки логов:

  • rotate — указывает сколько старых логов нужно хранить, в параметрах передается количество;
  • create — указывает, что необходимо создать пустой лог файл после перемещения старого;
  • dateext — добавляет дату ротации перед заголовком старого лога;
  • compress — указывает, что лог необходимо сжимать;
  • delaycompress — не сжимать последний и предпоследний журнал;
  • extension — сохранять оригинальный лог файл после ротации, если у него указанное расширение;
  • mail — отправлять Email после завершения ротации;
  • maxage — выполнять ротацию журналов, если они старше, чем указано;
  • missingok — не выдавать ошибки, если лог файла не существует;
  • olddir — перемещать старые логи в отдельную папку;
  • postrotate/endscript — выполнить произвольные команды после ротации;
  • start — номер, с которого будет начата нумерация старых логов;
  • size — размер лога, когда он будет перемещен;

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

адрес_файла_лога {директивы}

Теперь давайте создадим файл rsyslog.conf в папке /etc/logrotate.d/ и поместим в него настройки для ротации этого лога:

Эти настройки означают, что ротация журналов будет выполняться ежедневно, и мы будем хранить три последних журнала, более старые копии будут автоматически удаляться. Минимальный размер для ротации — 10 мегабайт, ротация не будет выполнена, если лог не занимает более 10 мегабайт. Будет использоваться сжатие, для всех журналов кроме последнего и предпоследнего. Точно по такому же принципу вы можете настроить ротацию логов для любого из журналов. Нужно создать такую секцию для каждого из логов, которыми вы хотите управлять.

Теперь осталось протестировать как работает наша конфигурация. Для этого запустим утилиту logrotate с опцией -d. Она выведет все, что планируется сделать, но не будет изменять файлы на диске. У нас есть файл /var/log/messages, размером 40 Мегабайт, посмотрим что будет делать утилита:

Как видите, программа обнаруживает файл лога и разделяет его на несколько частей. Вы можете убедиться, что logrotate будет запускаться как положено проверив расписание cron:

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

Установка и настройка syslog-ng

С установкой нет ничего сложного. Установить syslog-ng можно одной командой:

# yum install -y syslog-ng

Сразу переходим к настройке. Файл конфигурации располагается по адресу /etc/syslog-ng/syslog-ng.conf. Чтобы сервер начал принимать логи с удаленного устройства, его необходимо прописать в конфиг. Делается это просто. В самый конец конфигурационного файла добавляем информацию о новом устройстве:

destination d_xs-zabbix { file("/var/log/!remote/xs-zabbix.log"); };
filter f_xs-zabbix { netmask("10.1.3.29/255.255.255.255"); };
log { source(net); filter(f_xs-zabbix); destination(d_xs-zabbix); };
d_xs-zabbix Название назначения для записи лога по адресу /var/log/!remote/xs-zabbix.log
f_xs-zabbix Название фильтра по адресу сервера источника.
10.1.3.29 Адрес сервера источника логов

Соответственно для второго сервера нужно добавить еще 3 строки, например так:

destination d_xs-web { file("/var/log/!remote/xs-web.log"); };
filter f_xs-web { netmask("10.1.3.38/255.255.255.255"); };
log { source(net); filter(f_xs-web); destination(d_xs-web); };

И так далее. Добавляете столько серверов, сколько нужно. Не забудьте создать папку для логов. В моем примере это папка /var/log/!remote, сами файлы создавать не надо, служба автоматически их создаст, когда придет информация с удаленных серверов.

Запускаем syslog-ng и добавляем в автозагрузку:

# systemctl start syslog-ng
# systemctl enable syslog-ng

Проверим, запустилась ли служба:

# netstat -tulnp | grep syslog
udp 0 0 0.0.0.0:514 0.0.0.0:* 25960/syslog-ng

Все в порядке, слушает 514 udp порт. Не забудьте открыть этот порт в iptables, если у вас включен фаерволл. Сервер готов к приему логов.

Настройка rsyslogd

Объекты, приоритеты, и места назначения

Объект Приоритет Назначение 

Доступные объекты и приоритеты являются фиксированными и не могут быть добавлены. Таблица 2 показывает, какие объекты доступны, а таблица 3 показывает список всех приоритетов.имя_модуля

Объект Что логируется
 auth / authpriv Сообщения, связанные с аутентификацией.
 cron Сообщения, сгенерированные сервисом crond.
 daemon Универсальный объект, который можно использовать для неопределенных демонов.
 kern Сообщения ядра.
 lpr Сообщения, сгенерированные через систему печати.
 mail Сообщения, связанные с электронной почтой.
 mark Специальный объект, который можно использовать для периодической записи маркера.
 news Сообщения, генерируемые системой новостей NNTP.
 security То же, что и auth / authpriv. Не должен больше использоваться.
 syslog Сообщения, генерируемые системой syslog.
 user Сообщения генерируемые в пространстве пользователя.
 uucp Сообщения, сгенерированные устаревшей системой UUCP.
 local0-7 Резервные объекты, которые необходимы для использования тех объектов, которые отсутствуют в этой таблице.
Приоритет Используется для
 debug Отладочные сообщения, которые дадут как можно больше информации о работе сервиса.
 info Информационные сообщения о нормальной работе сервиса.
 notice Используется для информационных сообщений об элементах, которые позже могут стать проблемой.
 warning / warn Что-то не оптимальное, но ошибки пока нет.
 err /error Произошла некритическая ошибка.
 crit Произошла критическая ошибка.
 alert Используется, когда сервис перестал быть доступен.
 emerg / panic Сообщение генерируется, когда доступность сервиса прекращается.

Когда используется определенный приоритет, все сообщения с этим приоритетом и выше логируются в соответствии со спецификациями, используемыми в этом конкретном правиле. Если вам необходимо детально настроить логирование, когда сообщения с разными приоритетами отправляются в разные файлы, вы можете указать приоритет со знаком равенства (=) перед ним, как в следующем файле конфигурации, который будет отправлять все отладочные сообщения cron в файл с именем /var/log/cron.debug

Обратите внимание на использование дефиса (-) перед именем файла, который гарантирует, что сообщения буферизуются и не записываются немедленно на диск (что хорошо для производительности диска)

Нет необходимости учить наизусть названия rsyslogd  объектов и приоритетов. Все они перечислены в man 5 rsyslog.conf.
Упражнение 2. Изменение правил в rsyslog.confyum install -y httpd

ErrorLog    syslog:local1

systemctl restart httpd

systemctl restart httpdecho «*.debug /var/log/messages/messages-debug» > /etc/rsyslogd/debug.confsystemctl restart rsyslogdtail -f /var/log/messages-debuglogger -p daemon.debug «Daemon Debug Message»

Опции создания нового лог-файла (после ротации старого):

create права владелец группа
create владелец группа
Указать права доступа, владельца и группу владения нового свежесоздаваемого лог-файла сразу после его создания. Как уже упоминалось, если используются опции copy и copytruncate, то create не имеет смысла, так как старый файл остается на месте, новый файл не создается. Чтобы опция create отработала, файл должен отсутствовать. Права указываются восьмеричными значениями в таком же виде, как и при использовании программы chmod. Например, 644 или 600. Если какое-то значение (права/владелец/группа) опущено, то оно будет таким же, как у оригинального файла
nocreate Новые лог-файлы не создаются. Эта опция перегружает опцию create

Описание

В планировщике задач (cron) ежедневно выполняется запуск logrotate

/usr/sbin/logrotate /etc/logrotate.conf

с указанием файла конфига

В конфиге настраиваются глобальные параметры, которые будут применяться по умолчанию, и как правило подключается директория

include /etc/logrotate.d

откуда будут подружатся файлы с описанием правил (секции) для конкретных лог файлов.

При ротации логов — текущий log-файл с которым работает программа — удаляется или перемещается, поэтому после ротации лога, будет правильным перезапустить программу/сервис, чей log-файл был удален. Нужно это, что бы программе был сообщен новый дискриптор файла.
Хотя это ситуация может разрулится автоматически и без перезагрузки — если такую ситуацию предусмотрели разработчики.

Каждому архивному файлу присваивается номер, чем больше номер тем ‘старее’ архив.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: