rsyslog - мощный инструмент, но его документация не столь явна. Я не могу понять, как разобрать файл журнала и направить его прямо в Graylog в GELF формат.
Я нашел немного документации о вывод gelf в rsyslog но я не уверен, что делать дальше.
До сих пор он пытался поместить приведенный ниже conf в /etc/rsyslog.d/01-access.conf
но это, похоже, не работает ...
template(name="gelf" type="list") {
constant(value="{\"version\":\"1.1\",")
constant(value="\"host\":\"")
property(name="hostname")
constant(value="\",\"short_message\":\"")
property(name="msg" format="json")
constant(value="\",\"timestamp\":\"")
property(name="timegenerated" dateformat="unixtimestamp")
constant(value="\",\"level\":\"")
property(name="syslogseverity")
constant(value="\"}")
}
input(type="imfile"
File="/var/log/apache2/access.log"
Tag="apache-access"
)
if $programname == 'apache-access' then {
action(
type="omfwd"
Target="GRAYLOG-IP"
Port="12201"
Protocol="tcp"
template="gelf"
)
stop
}
Вы сталкиваетесь с этой проблемой, потому что отправка через tcp не работает с rsyslog из-за спецификации разделителя сообщений Gelf с нулевым байтом. Из официальной документации rsyslog: (http://www.rsyslog.com/doc/v8-stable/tutorials/gelf_forwarding.html) «Обратите внимание, что приведенный выше случай работает только для транспорта UDP. При использовании TCP Graylog ожидает нулевой байт в качестве разделителя сообщений. В настоящее время это невозможно с rsyslog.» Однако ваш пример должен работать через udp.
Небольшой совет, я определенно рекомендую проверить правила фильтра rsyslog, поскольку обработка сообщений будет продолжена с вашим примером (проверьте символ тильды).
Снято с: https://www.rsyslog.com/doc/master/tutorials/gelf_forwarding.html
При использовании TCP Graylog ожидает Nullbyte в качестве разделителя сообщений. Итак, чтобы использовать TCP, вам нужно изменить разделитель с помощью параметра TCP_FrameDelimiter.
action(type="omfwd" target="graylogserver" port="12201" protocol="tcp" template="gelf" TCP_FrameDelimiter="0" KeepAlive="on")