Вопрос или проблема
У нас есть система, в которой несколько устройств f5 отправляют логи в syslog-ng. Мы настроили syslog-ng для отправки в:
/path/to/directory/$HOST.
Это вызывает проблему, потому что, так как /local находится в поле имени хоста, он пытается отправить его в:
/path/to/directory/local/ или /path/to/directory/slot1/.
Поскольку мы не хотим создавать директории, ошибка следующая:
Директория не существует.
Я пытался использовать правило переписывания syslog-ng, чтобы заменить /local и /slot1 в именах хостов на local- и slot-, но, похоже, это не работает.
Вот правило переписывания:
rewrite r_f5{
subst("slot1/", "slot1-", value("HOST"), flags("global"), flags("ignore-case"));
subst("slot1/", "slot1-", value("MESSAGE"), flags("global"), flags("ignore-case"));
subst("local/", "local-", value("HOST"), flags("global"), flags("ignore-case"));
subst("local/", "local-", value("MESSAGE"), flags("global"), flags("ignore-case"));
};
Обратите внимание, что правила для сообщений были добавлены из-за того, что правила для хостов не сработали.
Вот правило ведения логов:
log { source(s_network_f5); rewrite(r_f5); destination(d_network_f5);};
Есть ли что-то, что я делаю неправильно в правиле переписывания?
K76259573: Добавление или изменение FQDN имен хостов для сообщений syslog
https://my.f5.com/manage/s/article/K76259573
В следующем примере мы выполняем переписывание сообщений только для сообщений, направленных на 2-й сервер Syslog (22.22.22.22
).
Сообщения Syslog, направленные на 1-й сервер Syslog (11.11.11.11
), по-прежнему будут иметь имя хоста в формате slot#/<FQDN>.
<${PRI}> = FACILITY + PRIORITY
slot1/CBJ01-SVR-LB01.celcom.net.my
$(substr ${HOST} 6 14) = начинается с 0 (перед s), на позиции 6 (перед C), вырезаем 14 символов = CBJ01-SVR-LB01
Vendor01@(CBJ01-SVR-LB01)(cfg-sync In Sync)(/S1-green-P::Active)(/Common)(tmos)# list sys syslog
sys syslog {
include "
filter f_remote_loghost {
level(info..emerg);
};
template custom_remote_template {
template(\"<${PRI}>$DATE $(substr ${HOST} 6 10) $PRIORITY $MSG from $HOST\\n\");
template_escape(no);
};
destination my_remote_server {
udp(\"11.11.11.11\"
port(514)
);
udp(\"22.22.22.22\"
port(514)
template(custom_remote_template)
persist-name(Remote1)
);
};
log {
source(s_syslog_pipe);
filter(f_remote_loghost);
destination(my_remote_server);
};
"
}
Vendor01@(CBJ01-SVR-LB01)(cfg-sync In Sync)(/S1-green-P::Active)(/Common)(tmos)#
Ответ или решение
Проблема с журналированием F5 в Syslog-ng: Анализ и Решение
Введение
Ваша ситуация с журналированием F5 устройств в систему syslog-ng
является распространенной проблемой, с которой сталкиваются администраторы сетей. Поскольку ваши устройства отправляют журналы с именами хостов, содержащими local/
или slot1/
, возникает проблема при попытке сохранить эти журналы в каталоги, что приводит к ошибкам о несуществующих директориях. В данной статье мы рассмотрим, как решить эту проблему, модифицировав ваши правила переписывания в syslog-ng
.
Проблема
Ваше текущее конфигурационное правило для направления журналов выглядит следующим образом:
/path/to/directory/$HOST
При этом значения хостов могут содержать префиксы local/
или slot1/
, что приводит к созданию некорректных путей, таких как /path/to/directory/local/
или /path/to/directory/slot1/
. Это становится причиной ошибок: "Директория не существует".
Проверка правил переписывания
Вы указали используемые вами правила переписывания:
rewrite r_f5 {
subst("slot1/", "slot1-", value("HOST"), flags("global"), flags("ignore-case"));
subst("local/", "local-", value("HOST"), flags("global"), flags("ignore-case"));
};
Анализ и Возможные Исправления
-
Проверка порядка правил: Убедитесь, что находитесь в правильной последовательности. Если
syslog-ng
пытается сохранить журнал до применения правил переписывания, изменение не будет применено. Попробуйте переместить вызов переписывания непосредственно перед определением целевого устройства. -
Изменение структуры правил: Убедитесь, что вы добавляете все необходимые изменения для
HOST
перед их использованием в целевом направлении. Возможный код может выглядеть следующим образом:
log {
source(s_network_f5);
rewrite(r_f5);
destination {
file("/path/to/directory/${HOST}.log");
};
};
-
Переписывание сообщений: Проблема может заключаться в неправильном указании местоположения замены. Переписывание, применяемое к сообщению, должно быть основано на
HOST
, а не на содержимом самого сообщения. Приведенные вами правила переписывания дляMESSAGE
не нужны, если удалены проблемы сHOST
. -
Примеры различных правил переписывания:
Вот пример, переопределяющий HOST
:
rewrite r_f5 {
subst("slot1/", "slot1-", value("HOST"), flags("global"));
subst("local/", "local-", value("HOST"), flags("global"));
set(value("HOST"), "new value"); # Вместо "new value" можете прописать корректное имя хоста
};
-
Логирование и отладка: Для того чтобы лучше понять, что происходит, добавьте дополнительные логи. Проверьте основной лог
syslog-ng
, который будет показывать, как именно обрабатываются сообщения. Это может помочь в выявлении ошибок. -
Документация F5: Ознакомьтесь с документацией, в том числе с статьей, относящейся к F5 коду K76259573, которая может содержать информацию о работе с использованием переписывания на уровне сообщений.
Заключение
Проблема с неправильным формированием имен директорий при работе с syslog-ng
и F5 может быть устранена с помощью правильной конфигурации правил переписывания хоста. В первую очередь, обратите внимание на порядок и структуру правил переписывания, убедитесь, что изменения применяются до их использования в настройках направлений. Если у вас возникли дальнейшие проблемы, логирование и просмотр документации помогут в их разрешении.
Приступайте к внесению вышеуказанных изменений, и это должно помочь устранить текущие ошибки и добиться правильной работы с журналами F5.