Убрать нули из сообщения в syslog-ng - PullRequest
0 голосов
/ 22 апреля 2020

Мне нужно удалить NULL из входящего сообщения, чтобы я мог переслать его обратно на другой хост. Syslog-ng не пересылает сообщения должным образом, которые имеют нулевые значения. Я пробовал следующее, но не могу понять, как нацелить NULL в строках. С помощью приведенного ниже я все еще вижу нули в своем локальном журнале, и удаленная система никогда не видит сообщения с нулями в нем (не все сообщения имеют нули, а те, которые не имеют нулей, пересылаются должным образом).

source s_ise {
  udp(port(522));
};

destination d_ise {
  file("/var/log/ise.log");
  udp("myhost.example" port(516) spoof_source(no));
};

rewrite r_ise {
  # remove nulls, or it won't forward properly
  subst("\x00", "", type("string"), value("MESSAGE"), flags(substring, global));
};

log {
  source(s_ise);
  filter(f_ise_aaa);
  rewrite(r_ise);
  destination(d_ise);
};

1 Ответ

1 голос
/ 22 апреля 2020

NULL считаются символами конца строки.

К счастью, источник UDP не зависит от конца строки (символы новой строки или NULL), поэтому перед синтаксическим анализом можно удалить все ненужные 0 байтов, например:

source s_ise {
  udp(port(522) flags(no-parse));
};

rewrite r_remove_nulls {
  subst('\x00', '', value("MESSAGE"), type(pcre), flags(global)); # single quotes!
};

parser p_syslog {
  syslog-parser();
};

destination d_ise {
  file("/var/log/ise.log");
  udp("myhost.example" port(516) spoof_source(no));
};

log {
  source(s_ise);
  rewrite(r_remove_nulls);
  parser(p_syslog);

  filter(f_ise_aaa);
  destination(d_ise);
};


В качестве альтернативы вы можете оставить NULL-байты, но в этом случае вам не следует использовать объекты конфигурации syslog-ng, которые обрабатывают сообщение как строки (например, парсеры, правила перезаписи на основе строк, строковые фильтры, et c).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...