Logs fields to Kibana field columns

Bonjour à tous et bonne année !

Je suis dans une entreprise de développement logiciels et nous avons environ 70 serveurs CentOS.

Je souhaite mettre en place ElasticStack pour faciliter la consultation des logs de tous les serveurs qui nous intéressent.

J'ai donc installé FileBeat, ElasticSearch et Kibana.
J'ai aussi créé des modules FileBeat pour lire les logs que nous créons avec nos logiciels.

Sur Kibana, j'arrive à lire mes logs, donc jusqu'à là tout va bien.
Sauf que maintenant je souhaite mettre en place une vue homogène de tous mes logs sur Kibana.

Par exemple, dans app/discover, je souhaite que tous mes logs soient présentés de cette façon :

| Time | agent.hostname | log.file.path | loglevel | process.pid | message |

Ce n'est qu'un exemple car ce n'est pas là mon problème.
Mon problème est que sur cet affichage, j'ai bien les colonnes @timestamp, agent.host.name et log.file.path complétées, mais loglevel et process.pid sont vide. De plus, ma colonne message contient TOUTE la ligne du log en question alors que je ne souhaite que la fin de la ligne du log.

| Time                       | agent.hostname | log.file.path              | loglevel | process.pid | message                                          |
|----------------------------|----------------|----------------------------|----------|-------------|--------------------------------------------------|
| Jan 6, 2021 @ 10:32:22.208 | mon_serveur    | /var/log/asterisk/messages | -        | -           | [Jan  6 10:32:21] VERBOSE[21975] logger.c: Found |

Et un exemple de résultat que j'aimerai obtenir est celui-ci :

| Time                       | agent.hostname | log.file.path              | loglevel | process.pid | message                                                                                                        |
|----------------------------|----------------|----------------------------|----------|-------------|----------------------------------------------------------------------------------------------------------------|
| Jan 6, 2021 @ 10:32:22.208 | mon_serveur    | /var/log/asterisk/messages | VERBOSE  | 21975       | logger.c: Found                                                                                                |
| Jan 6, 2021 @ 22:03:08.318 | second_serveur | /var/log/apache2/error.log | debug    | 9           | mod_authz_core.c(820): [client 172.17.0.1:50752] AH01626: authorization result of Require all granted: granted |

Voici ma pipeline pour Asterisk par exemple :

{
  "description": "Pipeline for parsing Asterisk logs",
  "processors": [{
    "grok":{
      "field":"message",
      "patterns":[
        "\\[%{MONTH:asterisk.month} %{MONTHNUM:asterisk.day} %{TIME:asterisk.time}\\] %{LOGLEVEL:loglevel}\\[%{INT:process.pid}\\]%{GREEDYDATA:asterisk.file}\\:%{GREEDYDATA:asterisk.log.message}"
      ]
    }
  }],
  "on_failure" : [{
    "set" : {
      "field" : "error.message",
      "value" : "{{ _ingest.on_failure_message }}"
    }
  }]
}

J'ai pas mal cherché dans la doc officielle, mais elle n'est pas assez claire pour moi et ça commence à m'embrouiller plus qu'autre chose. Est-ce qu'il m'est nécessaire d'avoir LogStash pour faire cette transformation ?

Merci d'avance pour votre aide.

Bonjour,

Meilleurs voeux à vous eglement.

Parce que ton parsing via Grok ne devrait pas bien matcher avec l'event log.

  1. Faut il pas mettre juste 1 \ au lieu de deux ? :
    %{LOGLEVEL:loglevel}\\[%{INT:process.pid}\\] => %{LOGLEVEL:loglevel}\[%{INT:process.pid}\]

  2. IL manque pas des %{SPACE} ici ? :
    \\[%{INT:process.pid}\\]%{GREEDYDATA:asterisk.file}

A mon avis, ça reviendra au même.

J'ai ajouté LogStash dans mon environnement.
J'ai bien mes logs visible sur Kibana, donc je suppose que la connection entre FileBeat <=> LogStash <=> ElasticSearch <=> Kibana est bonne.

J'ai modifié mon pipeline Asterisk :

description: "Pipeline for parsing Asterisk logs."
processors:
- set:
    field: event.ingested
    value: '{{_ingest.timestamp}}'
- grok:
    field: message
    patterns:
    - '\[%{ASTERISK_TIME:asterisk.log.time}\]%{SPACE}%{LOGLEVEL:log.level}\[%{INT:process.pid}\]%{SPACE}%{GREEDYDATA:asterisk.file}\:%{SPACE}%{GREEDYDATA:message}'
    pattern_definitions:
        ASTERISK_TIME: '%{MONTH}%{SPACE}%{MONTHDAY}%{SPACE}%{TIME}'
    ignore_missing: true
on_failure:
- set:
    field: error.message
    value: '{{ _ingest.on_failure_message }}'

Et voici mon fichier de configuration LogStash :

input {
  beats {
    port => 5043
  }
}

filter {
  dissect {
    mapping => {
      "message" => "[%{ts} %{+ts} %{+ts}] %{loglevel}[%{process.pid}] %{message}"
    }
  }
}

output {
  elasticsearch {
    hosts => ["myserveur:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  }
}

Avec cette configuration j'ai tout ce dont j'ai besoin