Как мы можем создать однострочные json в выходном файле filebeat

#elastic-stack #filebeat

#эластичный стек #filebeat

Вопрос:

Я использовал FileBeat для преобразования журналов apache2 и дампа в выходной файл. генерируемый выходной файл имеет тело JSON для каждого сообщения журнала apache2. но здесь мне нужно тело JSON в одной строке вместо синтаксического анализа.

При текущем формате я не могу извлекать каждое тело JSON из выходного файла, если мы сохраняем построчный JSON, тогда мы можем разделить каждую строку выходного файла и можем легко использовать каждое тело JSON.

Я изменил выходные конфигурации файла filebeat.yml. как показано ниже

output.file: путь: «/tmp/logstojson/apache2/» имя файла: filebeat разрешения: 0600 codec.json: pretty: false

Я не нашел ожидаемого формата в выходном файле.

Фактические данные выходного файла :

 { "@timestamp": "2019-04-09T13:12:47.106Z", 

  "@metadata": {

    "beat": "filebeat",

    "type": "doc",

    "version": "6.6.2",

    "pipeline": "filebeat-6.6.2-system-auth-pipeline"

  },

  "fileset": {

    "module": "system",

    "name": "auth"

  },

  "prospector": {

    "type": "log"

  },

  "input": {

    "type": "log"

  },

  "source": "/var/log/auth.log",

  "log": {

    "file": {

      "path": "/var/log/auth.log"

    }

  },

  "message": "Apr  9 13:12:45 ip-172-31-22-12 sudo: 
pam_unix(sudo:session): session closed for user root",

  "event": {

    "dataset": "system.auth"

  },

  "beat": {

    "version": "6.6.2",

    "name": "ip-172-31-22-12",

    "hostname": "ip-172-31-22-12"

  },

  "host": {

    "name": "ip-172-31-22-12"

  },

  "offset": 537068

}
  

ожидаемые данные выходного файла :

 { "@timestamp": "2019-04-09T13:12:47.106Z", "@metadata": {  "beat": "filebeat", "type": "doc", "version": "6.6.2",  "pipeline": "filebeat-6.6.2-system-auth-pipeline" }, "fileset": { "module": "system", "name": "auth" }, "prospector": { "type": "log" }, "input": { "type": "log" }, "source": "/var/log/auth.log", "log": { "file": {  "path": "/var/log/auth.log" } }, "message": "Apr  9 13:12:45 ip-172-31-22-12 sudo: pam_unix(sudo:session): session closed for user root", "event": { "dataset": "system.auth" }, "beat": { "version": "6.6.2", "name": "ip-172-31-22-12",  "hostname": "ip-172-31-22-12"  }, "host": { "name": "ip-172-31-22-12" }, "offset": 537068}
  

Ответ №1:

Не полный ответ, но это нормально, если вы не видите разницы при настройке, codec.json: pretty: false поскольку значение по умолчанию уже равно false (см.: документ о кодеке filebeat)

другим решением, которое я мог бы увидеть, было бы ручное форматирование вашего вывода json с помощью codec.format:
string: '%{[@timestamp]} %{[message]}'

Но это далеко не чисто или эффективно (если не совсем невозможно, если ваш ввод имеет некоторый уровень вариации или сложности)

Возможно, FB поддерживает другой кодек, не задокументированный на этой странице; в документе ES иногда может не хватать точности, так что это может стоить изучения.

Еще одно замечание: если вам нужны такого рода возможности преобразования / форматирования в ваших журналах, вы можете рассмотреть возможность использования logstash вместо этого (или, если вам также нужна облегченная транспортировка FB, используйте как FB, так и LS). LS поддерживает ввод файла или filebeat и вывод файла, и это, по сути, просто более полная утилита ETL, чем FB (которая является более легким средством пересылки). Вы должны окончательно рассмотреть это для такого рода проблем. (см. Документ о выходе файла LS: По умолчанию этот вывод записывает одно событие на строку в формате json. Вы можете настроить формат строки, используя линейный кодек, например)