Настройка rsyslog для хранения логов на удаленном сервере

Управление логированием[править]

Со временем объём логов растёт, и они занимают всё больше места на жёстком диске. Узнать объём имеющихся на текущий момент логов можно с помощью команды:

journalctl --disk-usage

Ротация логов

Настройка ротации логов осуществляется с помощью опций −−vacuum-size и −−vacuum-time.
Первая из них устанавливает предельно допустимый размер для хранимых на диске логов (в нашем примере — 1 ГБ):

journalctl --vacuum-size=1G

Как только объём логов превысит указанную цифру, лишние файлы будут автоматические удалены.
Аналогичным образом работает опция −−vacuum-time. Она устанавливает для логов срок хранения, по истечении которого они будут автоматически удалены:

journalctl --vacuum-time=1years
  • Настройка ротации в конфигурационном файле. Настройки ротации логов можно также прописать в конфигурационном файле /еtc/systemd/journald.conf, который включает в числе прочих следующие параметры:

    • SystemMaxUse= — максимальный объём, который логи могут занимать на диске;
    • SystemKeepFree= — объём свободного места, которое должно оставаться на диске после сохранения логов;
    • SystemMaxFileSize= — объём файла лога, по достижении которого он должен быть удален с диска;
    • RuntimeMaxUse= — максимальный объём, который логи могут занимать в файловой системе /run;
    • RuntimeKeepFree= — объём свободного места, которое должно оставаться в файловой системе /run после сохранения логов;
    • RuntimeMaxFileSize= — объём файла лога, по достижении которого он должен быть удален из файловой системы /run.

Единицы измерения: K, M, G, T, P, E.

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, который можно открыть с помощью этой команды:

Ротация логов

Во избежание заполнения дискового пространства необходимо использовать механизмы логирования по мере роста лог-файлов. Ротация логов – это процесс, подразумевающий отключение устаревших или слишком объёмных лог-файлов и их архивирование (на установленный период времени).

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

Ротация логов вручную

Чтобы запустить ротацию логов вручную (или же создать скрипт для запуска ротации), выполните команды:

То есть сначала нужно переместить текущий лог в новый файл для хранения. В имени нового лог-файла принято использовать суффикс 0, в имени более старого – суффикс 1, и т.д.

Команда, выполняющая ротацию логов:

На самом деле она не останавливает процесс Nginx, а отправляет ему сигнал, перезагружающий лог-файлы. Следовательно, новые запросы попадут в обновлённый лог-файл.

В файле /var/run/nginx.pid веб-сервер хранит pid главного процесса. Этот файл указывается в конфигурационном файле в строке, которая начинается с pid:

После выполнения ротации нужно запустить команду:

Эта команда позволяет процессу завершить переход. После этого можно заархивировать старый лог-файл.

Утилита logrotate

logrotate – это простая программа для ротации логов. Её можно найти в репозитории Ubuntu. Кроме того, Nginx поставляется в Ubuntu с пользовательским скриптом logrotate.

Чтобы просмотреть скрипт, введите:

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

Остальные строки файла будут выполнять ежедневную ротацию заданного файла, а также хранить 52 устаревшие его копии. К сожалению, данное руководство не охватывает общие настройки logrotate.

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

Этот раздел перезагружает лог-файлы Nginx после выполнения ротации.

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

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

logrotate --version

Вывод

logrotate 3.8.7

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

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

man logrotate

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

ОПИСАНИЕ

logrotate разработан для облегчения администрирования систем, которые порождают большое количество файлов журналов происходящих в системе событий. Утилита предоставляет автоматическое обращение, сжатие, удаление и отправление по электронной почте журналов системы. Каждый файл журнала сообщений может обрабатываться ежедневно, еженедельно, ежемесячно, либо когда увеличится в размерах выше указанного предела. Обычно logrotate выполняется в порядке ежедневного задания службы cron. В течении одного дня он не будет несколько раз изменять файл журнала сообщений, если критерий обработки для этого журнала не основан на размере файла и logrotate не запускается каждый день многократно; если не применяется опция -f или -force. В командной строке может быть задано любое количество конфигурационных файлов. Каждый последующий конфигурационный файл может переназначить настройки заданные в предыдущих файлах; таким образом, для logrotateважен порядок следования файлов конфигурации. Широко распространено применение единственного конфигурационного файла, включающего в себя другие используемые файлы настроек. О том, как это осуществить с помощью директивы include, смотрите ниже. Если в командной строке задан каталог, то все файлы, находящиеся в этом каталоге, используются в качестве конфигурационных. Если аргументы командной строки не заданы, то logrotate выведет информацию о версии программы, авторских правах и краткую справку об использовании. В случае возникновения любых ошибок при обработке журналов logrotate закончит работу с ненулевым значением кода возврата.

Описание

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

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

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

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

include /etc/logrotate.d

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

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

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

Настройка

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

Можно указывать по маске:

/var/log/apache2/*.log {
...
}

или конкретные файлы

/var/log/apache2/access.log  /var/log/apache2/error.log  {
...
}

Ротацию можно производить по расписанию (ежедневно, еженедельно …) или по достижению определенного размера log-файлом — это взаимоисключающие параметры.

Параметр Описание
rotate <число> Количество хранимых файлов
daily weekly monthly Производить ротацию раз в день, неделю, месяц.
Несовместимость: size
size <байт> size 1000
size 100k
size 1M
Производить ротацию если log-файл превысил указанный размер.
Несовместимость: daily, weekly, monthly
start <число> число с которого начнётся нумерация файлов
compress Архивировать файлы (по умолчанию gzip)
nocompress Отключает: compress
delaycompress Не сжимать ‘свеже’ созданный архив. Например access.log.1 не будет зжат.
Зависимость: compress
Несовместимость: nocompress
create <права><владелец><группа> create 640 root root После ротации создать пустой log-файл. Любые из этих атрибутов могут быть опущены,
в этом случае вместо них для нового файла будут использованы атрибуты,
имеющие те же значения, что и первоначальный log-файл
nocreate Не создавать пустой файл после ротации.
Отключает: create
copy Создать копию оригинального log-файла, не изменяя его.
Несовместимость: create
nocopy Отключает: copy
copytruncate Создать копию оригинального log-файла, а потом его ‘обнулить’.
Таким образом сам файл не удаляется и не меняется его дескриптор.
Несовместимость: create
ifempty Архивирует даже пустой файл (используется по умолчанию)
notifempty Не архивировать пустые файлы.
Отключает: ifempty
Несовместимость: size
missingok В случае отсутствия оригинального log-файла не вызовет ошибку
nomissingok В случае отсутствия оригинального log-файла вызовет ошибку.
Отключает: missingok
postrotate <команды> endscript Строки, находящиеся между postrotate и endscript
будут выполнены как sh скрипт после архивирования log-файла
prerotate <команды> endscript Аналогично postrotate, только действия будут выполнены до начала архивирования
sharedscripts Скрипты postrotate и prerotate будут выполнены только один раз в рамках своей секции.
nosharedscripts Отключает sharedscripts.
Скрипты будут выполняются при ротации каждого log-файла,
при определение /var/log/apache2/*.log скрипт будет выполнен столько раз
сколько уникальных log-файлов будет находится в данной директории
olddir <путь> Перемещать архивные файлы в указанную директорию
noolddir Отключает olddir
dateext К имени файлов журналов добавляется дата (%Y%m%d), вместо номера
su <user> <group> Выполняется с правами указанного пользователя. Необходимо если ошибка: «because parent directory has insecure permissions», т.е. на директорию с логами, есть право на запись кроме root’a
mail <mail@domain.com> Отправляет ротированные логи на почту. Локально должна быть настроена MTA sendmail или т.п.
nomail Отключает mail

Изучение конфигурации Logrotate

Информация о конфигурации LogRotate в целом можно найти в двух местах на Ubuntu:

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

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

Давайте посмотрим на файл конфигурации пакета LogRotate, в файле /etc/logrotate.d. cat для утилиты пакета apt:

cat/etc/logrotate.d/apt

Вывод

/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}

/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}

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

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

Есть много доступных вариантов конфигураций. Вы можете прочитать обо всех из них, набрав man logrotate в командной строке, чтобы вызвать страницу руководства LogRotate.

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

Ротация логов Apache

Ротация логов – это процесс, подразумевающий отключение устаревших или слишком объёмных лог-файлов и их архивирование (на установленный период времени). Apache может вносит в лог довольно большие объёмы данных, следовательно, во избежание заполнения дискового пространства необходимо настроить ротацию логов.

Ротация логов может быть очень простой (как, например, отключение слишком больших логов), а может иметь и более сложную конфигурацию (то есть, функционировать как система архивирования и хранения старых логов).

Рассмотрим методы настройки ротации логов Apache.

Ротация логов вручную

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

Это можно сделать вручную. Для этого нужно переместить устаревшие файлы, а затем, перезапустив Apache, обновить настройки веб-сервера и заставить его использовать новые логи.

Ниже приведён пример из документации Apache. Возможно, понадобится добавить в начало этих команд sudo.

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

Имейте в виду: ротация логов вручную очень ненадёжна в больших серверных средах.

Утилита logrotate

По умолчанию система Ubuntu настраивает ротацию логов при помощи утилиты logrotate.

Данная программа может выполнять ротацию логов при соблюдении определенных критериев. Просмотреть события, включающие Logrotate для ротации логов, можно в файле /etc/logrotate.d/apache2:

В нём находится несколько параметров logrotate

Обратите внимание на первую строку:. Это значит, что logrotate будет выполнять ротацию только тех логов, которые находятся в /var/log/apache2

Имейте это в виду, если вы выбрали другой каталог для хранения в конфигурации Apache

Это значит, что logrotate будет выполнять ротацию только тех логов, которые находятся в /var/log/apache2. Имейте это в виду, если вы выбрали другой каталог для хранения в конфигурации Apache.

Как видите, логи ротируются еженедельно. Также тут есть раздел кода, перезапускающий Apache после ротации:

Эти строки автоматически перезапускают веб-сервер Apache после завершения ротации.

Примечание: К сожалению, настройки данного файла не охвачены в данном руководстве.

Ротация логов по каналам

Использование каналов вместо файлов – простой способ передать обработку вывода программе логирования.  Это также решает проблему ротации логов, поскольку ротация может выполняться с помощью программы на серверной стороне (а не самим сервером Apache).

Чтобы логи обрабатывались программой логирования, принимающей стандартный вывод, замените следующую строку следующим образом:

Apache запустит программу логирования во время загрузки и перезапустит её в случае ошибки или сбоя.

Для ротации логов можно использовать разные программы, но по умолчанию Apache поставляется с rotatelogs. Чтобы настроить эту программу, используйте:

Аналогичную конфигурацию можно создать и для других программ.

Options

Tag Description
-v Turn on verbose mode.
-d Turns on debug mode and implies -v. In debug mode, no changes
will be made to the logs or to the logrotate state file.
-f, —force Tells logrotate to force the rotation, even if it doesn’t think
this is necessary. Sometimes this is useful after adding new
entries to logrotate, or if old log files have been removed by
hand, as the new files will be created, and logging will continue correctly.
-m, —mail Tells logrotate which command to use when mailing logs. This
command should accept two arguments: 1) the subject of the message, and 2) the recipient. The command must then read a message
on standard input and mail it to the recipient. The default mail command is /bin/mail -s.
-s, —state Tells logrotate to use an alternate state file. This is useful
if logrotate is being run as a different user for various sets
of log files. The default state file is /var/lib/logrotate/sta-
tus.
-usage Prints a short usage message.

Настройка Logrotate

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

sudo yum install logrotate

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

sudo apt install logrotate

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

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

vi /etc/logrotate.conf

include /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/ и поместим в него настройки для ротации этого лога:

/var/log/messages {
daily
rotate 3
size 10M
compress
delaycompress
}

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

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

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

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

ls /var/cron.daily/

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *