Доброго всем времени суток! Может быть кто-то сталкивался с этим, поможет, честно сказать я уже встал в тупик.
Задача: Взять любой лог, пусть будет nginx access_log, отдать его rsyslog в последнем подключить lognormalizer который переведет стандартный в json. А далее после нормализации просто записать его в отдельный файл.
Что я делаю:
- Создаю дополнительную конфигурацию для моего лога:
cat /etc/rsyslog.d/60-nginx.conf
module(load="imfile")
module(load="mmnormalize")
input(type="imfile"
ruleset="nginx_parser"
File="/var/log/nginx/access.log"
tag="nginx"
)
ruleset(name="nginx_parser") {
action(type="mmnormalize" rulebase="/home/yakunin/docker/nginx-rsyslog/nginx.rb" )
action(
type="omfile"
dirCreateMode="0700"
FileCreateMode="0644"
File="/var/log/nginx/rsys_access.log"
)
}
Далее сам файл правил:
cat nginx.rb
version=2
rule=:%clientip:word% %forward_for:word% %source:word% [%timestamp:char-to:]%] "%method:word% %request:word% HTTP/%httpversion:float%" %response:number% %bytes:number% "%referrer:char-to:"%" "%agent:char-to:"%"%blob:rest%
Далее, иду на nginx делаю запрос, в access_log прилетает строка, я проверяю работу своего парсера:
head -1 /var/log/nginx/access.log | lognormalizer -r nginx.rb -e json | jq
{
"blob": "",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36",
"referrer": "-",
"bytes": "5",
"response": "200",
"httpversion": "1.1",
"request": "/",
"method": "GET",
"timestamp": "26/May/2022:14:08:33 +0000",
"source": "-",
"forward_for": "-",
"clientip": "192.168.112.1"
}
Все работает, то есть правила и нормализация проходят хорошо. Но когда я иду в файл /var/log/nginx/rsys_access.log туда прилетает не нормализованный лог, а снова обычная строка, как бы из access_log в rsys_access.log
Что я хочу, что бы в rsys_access.log уже прилетал json. Да, пожалуйста не надо писать что nginx может сразу писать в json. Я в курсе. Тут дело именно заставить rsyslog делать это. Nginx просто для примера.