Loggers (syslog-ng, rsyslog and etc)
HolyBoy 9 января, 2009 - 09:47
Добрый день.
Кто какие логгеры использует на серверах?
syslog-ng (x86, amd64) работает стабильно, но раздражают его небогатые возможности, типа неумения создать папку с логами, неумения отфильтровывать логи так, чтобы не дублировать записи в разных файлах, не умеет менять формат выводимых логов.
rsyslog умеет всё, что умеет syslog-ng и чуточку больше: записи в разных файлах не повторяются, можно задавать нужный формат логов, писать в базу данных и тд и тп, но для amd64 нестабилен, зараза. Т.е. после определённого времени работы крешится.
Кто может что посоветовать на тему допиливания syslog-ng или иной другой логгер, одинаково хороший как для x86, так и для amd64?
»
- Для комментирования войдите или зарегистрируйтесь
я почти всегда использовал
я почти всегда использовал metalog, он идёт уже более-менее настроеный и со своим logrotate. всё бы хорошо, но с русским в UTF есть проблемы, сообщения плохо читаются... если на сервере локаль не русская (а зачем она там) то можно попробовать.
Я пробовал metalog, но он не
Я пробовал metalog, но он не очень понравился мне. Для меня средства ротирования логов не очень важны, т.к. есть logrotate.
Давайте пофлеймим :)
Как раз фильтры
syslog-ng
меня очччень порадовали.Поэтому предлагаю рассмотреть предметно: что и как разносим. Могу поделиться своей конфигурацией для случая разруливания логов почты.
Изменение формата выводимых логов: что имеется в виду? Мне почему-то кажется, что это - не является задачей логгера.
Создание каталога с логами? Опять же: при чём здесь
syslog-ng
??? При ротации средствамиlogrotate
- видится вполне реальным. Хотя лично я такой задачи не решал.Мн глючится, или
syslog-ng
тоже умеет работать с СУБД (вопрос: зачем приплетать СУБД к механизму логирования пока оставим в стороне, но он сам по себе является поводом для великоленого флейма)?..:wq
--
Live free or die
Ну давай. :P
К самим фильтрам syslog-ng у меня претензий нет.
Разговор немного о другом. Вот, возьмем, к примеру, логи фаерволла. В iptables создаем цепочку вида
и все дропнутые пакеты, к которым мы применим это, будут помечены DROP1. Казалось бы, всё хорошо, но…
Если логировать syslog-ng, то это выглядит как:
(здесь кусок из конфига)
и тут возникает проблема: логи дропнутых пакетов попадают не только в файл /var/log/firewall/block.log, но и в /var/log/system/kern.log, безбожно засоряя его. А почему? Да вот почему:
Jan 11 11:12:03 gate kernel: DROP1:IN=eth1 OUT= MAC=anyone:mac SRC=192.168.1.32 DST=192.168.1.255 LEN=229 TOS=0x00 PREC=0x00 TTL=128 ID=46390 PROTO=UDP SPT=138 DPT=138 LEN=209
Как видно — это кернельное сообщение. Но по сути оно к ядру не относится. Его надо в отдельный лог вынести, не смешивая с кернельным и не увеличивая в несколько раз забивание логами дискового места.
Аналогичная задача в rsyslog решается так:
Всё.
Сообщения, содержащие DROP1 попадут в /var/log/firewall/drop.log и больше никуда. Всё прочее, относящееся к ядру — в /var/log/kernel.
По поводу использования БД для хранения логов — это выгодно для случаев, когда делается один сервер для централизованного хранения и обработки данных с нескольких(!) серверов. Во всех остальных, ИМХО, обычного текстового файла достаточно. Это ИМХО я вынес из собственноручных тестов. :)
syslog-ng умеет работать с БД, но делает это через сторонние либы. rsyslog делает это нативно. Вот, тут сравнение можно глянуть: http://www.rsyslog.com/doc-rsyslog_ng_comparison.html
.
Так понятнее.
Можно не продолжать.
Ты выделил сообщения файрволла в отдельный файл, но не изменил настройки kern.log. А (в рамках сформулированной тобой задачи) надо было бы.
Та же задача в случае использования
syslog-ng
решается исправлениемfilter f_kern { facility(kern); };
наfilter f_kern { facility(kern) and not match("DROP1"); };
ИМХО - логичнее некуда.
Оно понятно.
Интереснее: в каких случаях это обоснованно и чем расплчиваешься.
И чем использование дополнительных библиотек (минус лишний код в случае, когда фича не используется) хуже?
:wq
--
Live free or die
..
Ага. Знать бы как.
Ты мне подсказываешь: вот так. Ок. Я бы не сказал, что логика работы фильтра syslog-ng очевидна, особенно, если надо много условий задавать. Например, вот полностью часть конфига rsyslog, в которой ясно видно, что куда валится:
Из приятных мелочей здесь можно отметить не только работу с сообщением по содержанию (msg, contains = match), но и обработку имени программы programname, isequal (чего в syslog-ng не встретил сходу).
Обоснованно в случаях, когда у тебя работает монитор, обрабатывающий статистику каждые, скажем, 10 минут. в таких случаях оптимальнее использовать запрос, который выдернет данные только за определённый период, не парся весь несколькосотмегабайтный файл. Расплата за использование БД только одна (при условии, что у нас выделена отдельная машина сбора логов в БД или в текстовые файлы): невозможность онлайн отслеживать и отлаживать программу, т.к. все данные надо предварительно запросить. Здесь, конечно, надо использовать вывод в текстовый файл и весь инструментарий для работы с ним: tail, grep, less, sed, awk и тд и тп.
В обработке статистики БД намного превосходит по скорости текстовые файлы. Точные данные не проси. Я это мерял давно и цифр не записал.
Здесь я сходу не отвечу. Знаю, что в rsyslog для работы с БД используются собственные подключаемые модули или libdbi, тогда как syslog-ng только с libdbi работает. Осмелюсь предположить, что с нативным модулем быстрее работает и безглючнее. Но это надо проверить.
.
Да, для большого количества условий описанный мной принцип выглядит не шибко изящно.
С другой стороны: тот факт, что запись обрабатывается только один раз я бы не назвал интуитивно-очевидным.
В силу отмеченного мной выше вопроса нельзя зказать, что так уж глобально-очевидно.
А ещё могу сказать, что отдельные индивидуумы в подобной ситуации предлагают валить всё в один файл и использовать
grep
:)))isequal
- не понял.Разруливать по LOG FACILITY, progname, match STRING
syslog-ng
умеет.Я же тут сразу задумался о нагрузке, конфигурации/настройке производительности и прочей радости...
Если бы только этим...
Здесь мне думается о поведении различных СУБД при перегрузке. А также о том, что разные (преимущественно самопровзглашённые) "гуру" от рассмотрения данной темы просто уходят (не, тут конечно есть уйма индивидуальных параметров, но они не отменяют общих принципов).
:wq
--
Live free or die
..
Подобные товарищи считаются в данном топике несуществующими. :)
Имеется в виду, что можно разруливать по точному совпадению isequal, по частичному contains.
Я не гуру и на тему загруженности СУБД много сказать не смогу. Те базы, что есть у меня, нагружены невысоко.
То, что я пробовал с ради интереса с rsyslog выглядело так: включал максимальную детализацию у всех программ на двух отдельных серверах и на третьем, пишущем логи; направлял этот поток весь в БД. А потом запросы делал с измерением времени. Потом перенаправлял не в БД, а в файл и также мерял. Кроме того, измерял парсинг файлов на самих серверах локально. По быстродействию получилось так:
1. До определённого размера быстрее всего локальный парсинг файлов.
2. СУБД.
3. Централизованный сбор логов в текстовые файлы и парсинг.
После некоторого момента 1. и 2. п. меняются местами или становятся сравнимыми по временным затратам. Параметры сервера с БД: 2xPIII, 512 Mb RAM, HDD IDE. В среднем скорость записи была 1 Гб/ч. СУБД PostgreSQL.
.
Данным аспектом не интересовался. В том числе потому что не вполне понимаю где оно может быть нужно (точнее - в принципе то представляю, но чтобы конкретный пример - нет).
Единственное, думается мне, - это и есть тот пример, когда может быть полезна возможность записи одной строки в несколько разных файлов логов.
Ну, мои знания тоже далеко не достаточны, но хочу обратить Ваше внимание на тот факт, что загрузка СУБД - характеристика далеко не одно- (много-мало) и даже не двух- (много-мало; чтение-запись) мерная.
В данной номинации (по объёму заносимой информации, числу потоков/интенсивности запросов на добавление записей, частоте и типу запросов на выборку) оптимизация СУБД не то, чтобы является головоломной задачей.
А ещё лично меня здесь интересует вопрос: логи каких приложений (полагаю: web-сервер, сервер электронной почты, где-то - прокси) предполагается обрабатывать и чем (насколько распространены в данном случае самописные парсеры)?
Думается мне, сначала нужно ответить на вопрос "зачем пишем логи". Из ответа достаточно очевидно следует таблица приоритетов.
А ещё интересная тема для обсуждения: где и какие логи имеет смысл писать.
Возвращаясь к теме
rsyslog
vssyslog-ng
скажу следующее:Где его достоинства дают заметные преимущества - мне лично не вполне представляется.
Но есть подозрение, что весовой коэффициент недостатка в виде некоторой нестабильности там тоже вырастет.
Все нужные мне функции по фильтрации сообщений
syslog-ng
обеспечивает (это я к тому, что не вполне представляю зачем может потребоваться разруливать сообщения поisequal
и что возможно то же распределение можно реализовать как-то иначе).:wq
--
Live free or die
...
Это частности. Складывать в БД можно любые логи, которые надо часто дёргать и которые имеют очень большие объемы. Зачем дёргать? Ну, к примеру, для построения отчётов в рил-тайм, частого поиска нужной информации за разные, достаточно большие периоды. Кроме почты, кстати, существуют логи с различных устройств: АТС, физических приборов и тд. ;)
Многопоточность, отсутствующая у syslog-ng, модульность rsyslog и прочие вещи уже сейчас достаточно интересны. Также, плюсом является постоянное развитие этого проекта, в отличие от syslog-ng. Разумеется, если не требуются особенные фичи, которые даёт rsyslog, то можно и syslog-ng обходиться, а некоторым и metalog хватает. :)
.
Думается мне, ты несколько преувеличиваешь.
Насколько жёсткое требование к Real Time (на РЕАЛЬНО БОЛЬШИХ) объёмах данных.
Есть мнение, что incremental mode парсера будет куда как экономичнее.
Вопрос в том: насколько руководство готово финансировать матчасть, необходимую для решения этой задачи с надлежащим качеством?..
Про АТС ты это зря сказал ;) Здесь я тебе про реалии много чего весёлого рассказать могу (как на уровне присоединяющего оператора, так и на уровне присоединяемого)... :)
И про логи в том числе.
Вопрос: где и насколько они реально необходимы?
metalog - это который syslogd?
Вопрос ИМХО не в том: какие фичи насколько нужны, а в том: насколько ты готов платить надёжностью (в случае той же почты - ещё не сильно страшно, а вот если речь идёт о логах АТС, с достаточно большим числом портов и высокой долей дорогого трафика... там и поныне заради надёжности забивают на оперативность и используют встроенные возможности АТС по записи статистики в файл)?
Относительно же развития рекомендую посмотреть на график развития webalizer'а ;)
:wq
--
Live free or die
неа
metalog это metalog, когда-то он рекомендовался по умолчанию в gentoo. Имеет встроенный и базово настроенный logrotate, единственно что мне несколько ненравится - с UTF несовсем дружит...
>>А ещё могу сказать, что
>>А ещё могу сказать, что отдельные индивидуумы в подобной ситуации предлагают валить всё в один файл
Это, как бы, нормальная практика. Иногда для поиска врагов полезно видеть общую картину завала. Разбить общий поток лога на несколько не вопрос, к тому же очень удобно отслеживать один класс событий отдельно от остальнеого окружения. А вот собрать из нескольких один в той же последовательности нереально.
По теме
Испоьзую syslog-ng. Вполне достойный и гибкий логгер. Если не нравится ваш собственный фильтр - откорректируйте его.
По поводу хранения логов целиком в бд. Если запись лога не парсить по полям и таблицам - то особого смысла в этом нет. Накладные расходы на парсинг и добавление записи в субд значительно превышают оные при выводе строки в файл. Задача логгера всеж таки ближе к оперативности записи. Плюс к тому 99% логов это мусор, в котором надо найти некий перл. Какой - никто точно не скажет, зависит от постановки задачи. Причем старый лог - штука постоянная. Потому конкретный отчет по логу за определенный период неизменен. Соответсвенно запрос к бд посылаем 1 раз и забываем про него. Ну и зачем тогда мы строили индексы?
.
А я это отрицаю?
Речь всего лишь о том, что эта практика, как и все прочие, имеет область применимости (к вопросу: зачем пишутся логи, в смысле - есть несколько различных целей).
Не только поиска врагов.
Но! Практически всего - по горячим следам.
Отдельные же логи для анализа/обработки запросов необходимо хранить месяцами.
И каждый из полученных кусков обрабатывать в соответствии с индивидуальными условиями??? :)
В переводе: чем задуматься над частным решением: что, как и зачем логировать - валим всё в один файл, а там - видно будет? Так? :)
Речь идёт о логике работы и принципах написания фильтров (которые не всегда смотрятся изящно). Это - факт.
Я бы сказал: надёжной и лишь достаточно оперативной.
Думаю, корректнее сказать: где-то в 60-80% случаев нельзя априори сказать что будешь искать.
Только обращения к логам далеко не сводятся к формированию отчётов.
:wq
--
Live free or die
+
Да, забыл (в силу того что лично мне на данном этапе не нужно):
syslog-ng
умеет фильтровать и по уровням (info
,notice
/etc).:wq
--
Live free or die
Хорошая статейка:
Хорошая статейка: http://belgorod.lug.ru/wiki/index.php/Настройка_syslog-ng
Меня в значительно бОльшей
Меня в значительно бОльшей степени порадовала (в качестве нулевого приближения) http://sial.org/howto/logging/syslog-ng/
Ну а дальше - здравый смысл && представления о том, что и как должно логировать +
man syslog-ng.conf
.:wq
--
Live free or die