LINUX.ORG.RU
ФорумAdmin

rsyslog + lognormalizer вывод в json

 ,


0

1

Доброго всем времени суток! Может быть кто-то сталкивался с этим, поможет, честно сказать я уже встал в тупик.

Задача: Взять любой лог, пусть будет nginx access_log, отдать его rsyslog в последнем подключить lognormalizer который переведет стандартный в json. А далее после нормализации просто записать его в отдельный файл.

Что я делаю:

  1. Создаю дополнительную конфигурацию для моего лога:
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 просто для примера.


Насколько я понял, mmnormalize просто парсит лог, чтобы отдельные поля были доступны как переменные rsyslog. И все. А дальше ты уже сам должен определить свой template, который будет выводить эти поля в формате json, или в любом другом нужном тебе формате. Template ты не определяешь, поэтому и получаешь вывод as is.

bigbit ★★★★★
()