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

6 Мониторинг файлов журналов

Обзор

Zabbix можно использовать для централизованного мониторинга и анализа файлов журналов с/без поддержки ротации журналов.

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

Для наблюдения за файлом журнала у вас должно быть:

  • Zabbix агент, работающий на узле сети
  • настроенный элемент данных для мониторинга журнала

Максимальный размер наблюдаемого файла журнала зависит от поддержки больших файлов.

Настройка

Проверка параметров агента

Убедитесь, что в файле конфигурации агента:

  • параметр 'Hostname' совпадает с именем узла сети в веб-интерфейсе;
  • в параметре 'ServerActive' указаны серверы для обработки активных проверок.
Настройка элемента данных

Настройте элемент данных для мониторинга журнала.

Все обязательные поля ввода отмечены красной звёздочкой.

Специально для элементов данных наблюдения за журналами вам необходимо указать:

Тип Здесь выберите Zabbix агент (активный).
Ключ Используйте один из следующих ключей:
log[] или logrt[]:
Эти два ключа элементов данных позволяют выполнять мониторинг файлов журналов и фильтровать записи в журналах по их содержимому при помощи регулярного выражения, если оно присутствует.
Например: log[/var/log/syslog,error]. Убедитесь, что у файла имеются права на чтение для пользователя 'zabbix', в противном случае состояние элемента данных будет 'не поддерживается'.
log.count[] или logrt.count[]:
Эти два ключа элементов данных позволяют получить только количество соответствующих строк.
Для получения более подробных сведений касательно использования этих элементов данных и их параметров смотрите раздел поддерживаемых ключей элементов данных Zabbix агентом.
Тип информации Заполняется автоматически:
Для элементов данных log[] или logrt[] - Журнал (лог);
для элементов данных log.count[] или logrt.count[] - Числовой (целое положительное).
Если используется опциональный параметр вывод, вы можете вручную выбрать подходящий тип информации, отличный от "Журнал (лог)".
Обратите внимание, что выбор не журнального типа информации приведёт к потере локального штампа времени.
Интервал обновления (в сек) Этот параметр определяет, как часто Zabbix агент будет проверять наличие любых изменений в файле журнала. Указав этот параметр равным 1 секунде, вы можете быть уверенными, что получите новые записи как можно скорее.
Формат времени журнала В этом поле вы можете опционально задать шаблон для анализа штампа времени строки журнала.
Если оставить пустым, штамп времени не будет анализироваться.
Поддерживаемые заменители:
* y: Год (0001-9999)
* M: Месяц (01-12)
* d: День (01-31)
* h: Час (00-23)
* m: Минута (00-59)
* s: Секунда (00-59)
Например, рассмотрим следующую строку из файла журнала Zabbix агента:
" 23480:20100328:154718.045 Zabbix agent started. Zabbix 1.8.2 (revision 11211)."
Она начинается с шести символьных позиций для PID, далее следуют дата, время и остальная часть строки.
Форматом времени журнала для такой строки могло бы являться "pppppp:yyyyMMdd:hhmmss".
Обратите внимание, что символы "p" и ":" являются лишь заменителями и могут быть любыми символами, за исключением "yMdhms".

Важные замечания

  • Сервер и агент следят за размером наблюдаемого журнала и временем последней модификации (для logrt) при помощи двух счётчиков. Кроме того:
    • Также агент использует номера inode (на UNIX/GNU/Linux), индексы файлов (на Microsoft Windows) и MD5 суммы первых 512 байт файла журнала для улучшения выбора в случае, когда файлы журнала усекаются и ротируются.
    • На системах UNIX/GNU/Linux предполагается, что файловые системы, где хранятся файлы журналов, сообщают номера inode-ов, которые могут быть использованы для слежения за состоянием файлов.
    • На системах Microsoft Windows Zabbix агент определяет тип файловой системы, на которой находятся файлы журналов, и использует:
      • на файловой системе NTFS - 64-битные файловые индексы;
      • на файловых системах ReFS (только с Microsoft Windows Server 2012) - 128-битные ID файлов;
      • на файловых системах где файловые индексы меняются (т.е. FAT32, exFAT) используется запасной алгоритм для получения разумного подхода в неопределенных условиях, когда ротация файла журнала приводит в результате к множеству файлов журналов с одинаковым временем изменения.
    • Номера inode, индексы файлов и суммы MD5 собираются Zabbix агентом. Они не передаются Zabbix серверу и теряются в случае остановки Zabbix агента.
    • Не меняйте время последней модификации файлов журналов утилитой 'touch', не копируйте файл журнала с последующим восстановлением его имени (это изменит идентификатор inode файла). В обоих случаях файл будет рассматриваться как другой и будет проанализирован с самого начала, что может привести к дубликатам оповещений.
    • Если имеется несколько совпадающих файлов журналов для элемента данных logrt[] и Zabbix агент следит за наиболее новым из них и этот более новый файл журнала удаляется, то будет записано сообщение с предупреждением "there are no files matching "<шаблон регулярного выражения>" in "<директория>". Zabbix агент игнорирует файлы журналов со временем модификации меньшим, чем последнее время модификации, полученное агентом во время проверки элемента данных logrt[].
  • Агент начинает читать файл журнала с той позиции, на которой он остановился последний раз.
  • Количество уже проанализированных байт (счётчик размера) и время последней модификации (счетчик времени) сохраняются в базе данных Zabbix и отправляются агенту, чтобы убедиться, что агент начнёт читать файл журнала с этой позиции в случаях, когда агент только что был запущен или агент получил элементы данных, которые были ранее деактивированы или не поддерживались. Однако, если агент получает ненулевой счётчик размера от сервера, но элементы данных logrt[] или logrt.count[] не найдены и не удаётся найти соответствующие файлы, то счётчик размера сбрасывается в 0, чтобы начать анализ с начала, если файлы появятся позже.
  • Всякий раз, когда файл журнала становится меньше, чем известное агенту значение счётчика размера, счётчик обнуляется и агент начинает читать файл журнала с самого начала, принимая во внимание счётчик времени.
  • Eсли есть несколько файлов журналов с одинаковым временем последней модификации файла в соответствующей папке, агент пытается корректно проанализировать все файлы журналов с одинаковым временем модификации и избежать пропущенных данных или повторного анализа тех же данных, хотя это и невозможно гарантировать во всех возможных ситуациях. Агент ни предполагает какую либо определённую схему ротации файлов журналов, ни определяет её. Когда есть несколько фалов журналов с одинаковым временем последнего изменения, агент будет обрабатывать их лексикографически в порядке убывания. Таким образом, для некоторых схем ротации файлы журналов будут проанализированы в их оригинальном порядке. Для других же схем ротации журналов первоначальный порядок файла журнала не будет соблюдаться, что может привести к получению найденных по шаблону строк файла журнала в изменённом порядке (проблема не возникает, если файлы журнала имеют разное время последней модификации).
  • Zabbix агент обрабатывает новые записи файла журнала один раз за Период обновления секунд.
  • Zabbix агент отправляет не более чем макс. кол-во строк записей из файла журнала за секунду. Это ограничение предотвращает перегрузку сети и ресурсов процессора и переопределяет значение по умолчанию, предусмотренное параметром MaxLinesPerSecond в файле конфигурации агента.
  • Для поиска необходимой строки Zabbix обработает в 10 раз больше строк, чем указано в параметре MaxLinesPerSecond. Таким образом, например, если элемент данных log[] или logrt[] имеет Интервал обновления 1 секунда, то по умолчанию агент за одну проверку проанализирует не более чем 200 строк файла журнала и отправит Zabbix серверу не более 20 совпавших записей. Увеличением параметра MaxLinesPerSecond в файле конфигурации агента или указанием параметра макс. кол-во строк в ключе элемента данных, лимит можно увеличить вплоть до 10000 проанализированных записей в журнале и 1000 совпадающих записей для отправки Zabbix серверу за одну проверку. Если Интервал обновления указан значением в 2 секунды, лимиты для одной проверки могут быть увеличены в два раза больше, чем для Интервала обновления в 1 секунду.
  • Кроме того, значения log и log.count всегда ограничены 50% размера буфера отправки у агента, даже если в буфере нет значений, не связанных с данными из файлов журналов. Таким образом, чтобы значения макс. кол-во строк были отправлены за одно подключение (а не за несколько подключений), параметр агента BufferSize должен быть равен по крайней мере ("макс. кол-во строк" x 2).
  • При отсутствии элементов данных журналов весь размер буфера используется для значений, не связанных с данными из журналов. Когда появляются значения от файлов журналов, они при необходимости заменяют устаревшие данные, не связанные с файлами журналов, до максимально предусмотренного уровня 50%.
  • Если в файле журнала строка длиннее 256 КБ, то только первые 256 КБ сопоставляются с регулярным выражением, остальная часть игнорируется. Однако, если Zabbix агент был остановлен в процессе обработки длинной строки, внутреннее состояние агента теряется и после перезапуска агента длинная строчка может быть проанализирована заново и иначе.
  • Специальное примечание для разделителей пути "\": если формат_файла представлен как "file\.log", тогда там не должно быть папки "file", поскольку невозможно однозначно определить, экранируется ли это символ "." или это первый символ в имени файла.
  • Регулярные выражения для logrt поддерживаются только в именах файлов, совпадение регулярного выражения с папкой не поддерживается.
  • На платформах UNIX элементы данных logrt[] становятся НЕПОДДЕРЖИВАЕМЫМИ в случае если папка, где файл журнала должен был бы находиться, не существует.
  • В Microsoft Windows, если папка не существует, то элемент данных не переводится в состояние НЕ ПОДДЕРЖИВАЕТСЯ (например, если в ключе элемента данных папка указана с ошибкой)
  • Отсутствие файла журнала для элемента данных logrt[] не переводит его в состояние НЕ ПОДДЕРЖИВАЕТСЯ. Ошибки чтения файлов журналов для элемента данных logrt[] записываются в журнал агента как предупреждения, но не переводят элемент данных в состояние НЕ ПОДДЕРЖИВАЕТСЯ.
  • Журнал Zabbix агента может быть очень полезен для поиска причин, почему элементы данных log[] или logrt[] становятся НЕПОДДЕРЖИВАЕМЫМИ. Zabbix может мониторить свой файл журнала агента, за исключением случая, когда он в режиме DebugLevel=4.

Извлечение совпадающей части регулярного выражения

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

Начиная с Zabbix 2.2.0, элементы данных файлов журналов имеют возможность извлекать из строк файла желаемые значения. Это достигается с помощью дополнительного параметра вывод у элементов данных log и logrt.

Использование параметра 'вывод' позволяет обозначить "подгруппу совпадения", в которой мы можем быть заинтересованы.

Итак, например

log[/путь/к/файлу,"large result buffer allocation.*Entries: ([0-9]+)",,,,\1]

должен позволить получить количество элементов (Entries) из следующего содержимого:

Fr Feb 07 2014 11:07:36.6690 */ Thread Id 1400 (GLEWF) large result
       buffer allocation - /Length: 437136/Entries: 5948/Client Ver: >=10/RPC
       ID: 41726453/User: AUser/Form: CFG:ServiceLevelAgreement

Вернется только число, так как \1 ссылается только на первую и единственную интересующую подгруппу: ([0-9]+)

И, вместе с возможностью извлечения и получения числа, значение можно использовать в определениях триггеров.

Использование параметра максзадержка

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

Параметр 'maxdelay' > 0, может привести к игнорированию важных записей в файлах журналов и пропуску оповещений. Используйте этот параметр осторожно и на свой страх и риск, только по необходимости.

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

Встроенная защита от перегрузки состоит из настраиваемого параметра 'макс. кол-во строк' (защищает сервер от получения слишком большого количества совпадающих строк в журнале) и ограничения в 10*'макс. кол-во строк' (защищает CPU и I/O хоста от перегрузки агентом за одну проверку). Тем не менее, имеется 2 проблемы со встроенным механизмом защиты. Во-первых, на сервер будет отправлено большое количество потенциально не очень информативных сообщений, которые займут место в базе данных. Во-вторых, по причине ограниченного количества строк, анализируемых в секунду, агент может отставать на часы от самых новых записей в журнале. Вполне вероятно, что вы захотите как можно быстрее быть информированным о текущей ситуации в файлах журналов вместо ковыряния часами старых записей.

Решением обеих проблем является использование параметра 'максзадержка'. Если параметр 'максзадержка' > 0, во время каждой проверки измеряются количество обработанных байт, количество оставшихся байт и время обработки. Отталкиваясь от этих чисел, агент вычисляет предполагаемую задержку - сколько секунд может занять анализ всех оставшихся в файле журнала записей.

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

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

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

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

14287:20160602:174344.206 item:"logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]"
       logfile:"/home/zabbix32/test1.log" skipping 679858 bytes
       (from byte 75653115 to byte 76332973) to meet maxdelay

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

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

Не рекомендуется указывать 'максзадержка' < 'интервал обновления' (это может привести к частым маленьким "прыжкам").

Заметки по обработке ротации 'copytruncate' файлов журналов

Элемент данных logrt с опцией copytruncate подразумевает, что разные файлы журналов имеют разные записи (по крайней мере штампы времени в них отличаются), поэтому MD5 суммы начальных блоков (до первых 512 байт) будут отличаться. Два файла с одинаковыми MD5 суммами начальных блоков означают, что один из них оригинал, а второй - копия.

Элемент данных logrt с опцией copytruncate делает попытку корректной обработки копий файлов журналов без дубликатов сообщений. Тем не менее, такие варианты как создание нескольких копий файлов журналов с одинаковыми штампами времени, ротация файлов журналов чаще чем интервал обновления logrt[] элемента данных, частый перезапуск агента не рекомендуются. Агент пытается справиться со всеми этими ситуациями, но хорошие результаты не гарантируются при всех обстоятельствах.

Примечания к постоянным файлам у log*[] элементов данных

Нагрузка на I/O

Постоянный файл элементов данных обновляется после успешной отправки каждой партии данных (содержащей данные по элементам данных) на сервер. Например, по умолчанию 'BufferSize' равен 100. Если элемент данных журнала нашёл 70 совпадающих записей, то первые 50 записей будут отправлены одной партией, постоянный файл будет обновлён, затем оставшиеся 20 записей будут отправлены второй партией (возможно, с некоторой задержкой на буферизацию большего количества данных), и затем постоянный файл будет снова обновлен.

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

Каждая совпадающая строка с элементов данных log[] и logrt[] и результат проверки каждого элемента данных log.count[] и logrt.count[] требует свободного слота в выделенных 50% области буфера отправки в агенте. Элементы буфера периодически отправляются серверу (или прокси), и слоты буфера становятся снова пустыми.

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

Во время длительных нарушений связи все слоты журналов становятся занятыми и выполняются следующие действия:

  • Проверки элементов данных log[] и logrt[] останавливаются. Когда связь восстановится и появятся свободные слоты, проверки возобновятся с предыдущей позиции. Совпадающие строки не будут потеряны, они просто будут отправлены позже.
  • Проверки log.count[] и logrt.count[] останавливаются, если maxdelay = 0 (по умолчанию). Поведение похоже на элементы данных log[] и logrt[], описанное выше. Обратите внимание, что потеря связи может повлиять на результаты log.count[] и logrt.count[]: например, одна проверка насчитывает 100 совпадающих строк в файле журнала, но по причине отсутствия свободных слотов в буфере проверка остановлена. Когда связь восстановится, агент насчитает те же 100 совпадающих строк, а также 70 новых совпадающих строк. После чего агент отправит количество = 170, как будто они были найдены за одну проверку.
  • Проверки log.count[] и logrt.count[] при макс. задержка > 0: если не было "прыжка" во время проверки, тогда поведение аналогично описанному выше. Если всё же был "прыжок" через строки файла журнала, тогда позиция после "прыжка" сохранится, а вычисленный результат будет отброшен. Таким образом, агент пытается не отставать от увеличивающегося файла журнала, даже в случае проблем со связью.

Handling of regular expression compilation and runtime errors

If a regular expression used in log[], logrt[], log.count[] or logrt.count[] item cannot be compiled by PCRE or PCRE2 library then the item goes into NOTSUPPORTED state with an error message. To continue monitoring the log item, the regular expression should be fixed.

If the regular expression compiles successfully, but fails at runtime (on some or on all log records), then the log item remains supported and monitoring continues. The runtime error is logged in the Zabbix agent log file (without the log file record).

Note that the logging of regular expression runtime errors is supported since Zabbix 6.4.6.

The logging rate is limited to one runtime error per check to allow Zabbix agent to monitor its own log file. For example, if 10 records are analyzed and 3 records fail with a regexp runtime error, one record is produced in the agent log.

Exception: if MaxLinesPerSecond=1 and update interval=1 (only 1 record is allowed to analyze per check) then regexp runtime errors are not logged.

zabbix_agentd logs the item key in case of a runtime error, zabbix_agent2 logs the item ID to help identify which log item has runtime errors. It is recommended to redesign the regular expression in case of runtime errors.

Назначение постоянных файлов

Когда Zabbix агент запускается, он получает список активных проверок от Zabbix сервера или прокси. Для log*[] метрик агент получает размер обработанного журнала и время модификации чтобы найти, откуда следует начать мониторинг файла журнала. В зависимости от реального размера файла журнала и времени модификации, полученных от файловой системы, агент решает: либо продолжить мониторинг файла журнала с обработанного размера журнала, либо проанализировать файл журнала с самого его начала.

Работающий агент поддерживает большой набор атрибутов для отслеживания между проверками всех наблюдаемых файлов журналов. Этот состояние в памяти теряется при остановке агента.

Новый опциональный параметр ** постоянное_хранилище** указывает директорию для хранения этого состояния в файле по log[], log.count[], logrt[] или logrt.count[] элементам данных. Состояние элемента данных журнала восстанавливается из постоянного файла после перезапуска Zabbix агента.

Основным сценарием применения такого подхода является мониторинг файла журнала, который расположен на зеркалируемой файловой системе. До какого-то момента файл журнала записывается в обоих зеркалах. Затем зеркала разделяются. На активном зеркале копия файла журнала продолжает рости, получая новые записи. Zabbix агент анализирует их и отправляет на сервер размер обработанного журнала и время модификации. На стороне пассивного зеркала копия файла журнала остаётся той же самой, находясь далеко позади активной копии. Затем операционная система и Zabbix агент перезагружаются с пассивной копии. Полученные от сервера Zabbix агентом размер обработанного журнала и время модификации могут быть недостоверными для ситуации с пассивной копией. Для продолжения наблюдения за файлом журнала с того же места, в котором агент остановил обработку файла при разделении зеркала, агент восстанавливает своё состояние из постоянного файла.

Работа агента с постоянным файлом

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

В процессе работы агента постоянные файлы открыты на запись (с использованием fopen(имя_файла, "w")) и перезаписываются последними данными. Шанс потери данных постоянного файла, если перезапись и разделение зеркала файловой системы совпадут, очень мал, специальной обработка такого случая нет. После записи в постоянный файл НЕ следует принудительной синхронизации с носителями информации (fsync() не вызывается).

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

При остановке агента не выполняется никаких специальных действий.

После получения списка активных проверок агент помечает устаревшие постоянные файлы для удаления. Постоянный файл становится устаревшим, если: 1) соответствующий элемент данных журнала более не наблюдается, 2) элемент данных журнала перенастраивается на другое расположение постоянного_хранилища, нежели ранее.

Удаление выполняется с задержкой в 24 часа, так как файлы журналов в НЕПОДДЕРЖИВАЕМОМ состоянии не включаются в список активных проверок, но могут стать ПОДДЕРЖИВАЕМЫМИ позже, и тогда их постоянные файлы будут полезны.

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

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

Именование и расположение постоянных файлов

Zabbix агент различает активные проверки по их ключам. Например, logrt[/home/zabbix/test.log] и logrt[/home/zabbix/test.log,] - разные элементы данных. Изменение в веб-интерфейсе элемента данных logrt[/home/zabbix/test.log,,,10] на logrt[/home/zabbix/test.log,,,20] приведёт к удалению элемента данных logrt[/home/zabbix/test.log,,,10] из списка активных проверок агента и созданию элемента данных logrt[/home/zabbix/test.log,,,20] (некоторые атрибуты сохраняются при изменениях в веб-интерфейсе / на стороне сервера, но не на стороне агента).

Имя файла состоит из MD5 суммы ключа элемента данных с длиной ключа, добавляемой для уменьшения возможных пересечений. Например, состояние элемента данных logrt[/home/zabbix50/test.log,,,,,,,,/home/zabbix50/agent_private] будет храниться в постоянном файле c963ade4008054813bbc0a650bb8e09266.

Несколько элементов данных могут использовать одно и то же значение постоянного_хранилища.

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

Если директорию постоянного_хранилища не удаётся создать или она не существует, или права доступа Zabbix агента не позволяют создавать/записывать/читать/удалять файлы, тогда элемент данных журнала становится НЕПОДДЕРЖИВАЕМЫМ.

Если права доступа к файлам постоянного хранилища отозваны во время работы агента или возникают другие ошибки (например, заполнился диск), тогда ошибки вносятся в файл журнала агента, но элемент данных не становится НЕПОДДЕРЖИВАЕМЫМ.