1 votes

Comment puis-je analyser un nombre d'octets lisible par l'homme dans Logstash ?

J'ai affaire à des fichiers journaux contenant des parties telles que :

538,486K of 1,048,576K

Ils représentent l'utilisation de la mémoire (espace du tas de Java) rendue dans un format lisible par l'homme. J'aimerais suivre ces chiffres dans des graphiques dans Kibana. Pour ce faire, j'aimerais utiliser le filtre grok de Logstash pour analyser ces chiffres, mais je ne sais pas comment gérer (c'est-à-dire ignorer) le séparateur des milliers.

L'idéal serait d'avoir quelque chose qui puisse également gérer le "K" et le multiplier par mille. À l'heure actuelle, je ne sais pas si un système enregistre dans une unité autre que le kilooctet, mais je préfère ne pas faire cette supposition.

1voto

rutter Points 128

El mutate permet de remplacer le texte avec le filtre gsub option.

gsub prend un tableau, où chaque triplet de valeurs indique :

  • Nom du champ cible
  • Modèle de recherche
  • Remplacer le motif

Il supporte techniquement les expressions régulières, mais nous n'en avons pas besoin dans ce cas.

D'abord, on enlève les virgules. C'est assez simple.

Deuxièmement, nous nous multiplions. Est-ce que K multiplier par 1000 ? Si c'est le cas, il me semble que nous pouvons simplement remplacer K con 000 .

Mettez-les ensemble :

filter {
    mutate {
        gsub {[
            "some_field", ",", "",
            "some_field", "K", "000"
        ]}
    }
}

Vous pouvez ajouter d'autres options de remplacement si nécessaire.

En fonction de votre situation, K pourrait multiplier par 1024, ce qui va être un peu plus compliqué. Je ne vois pas de solution toute faite, mais vous pouvez utiliser la fonction ruby pour faire de l'arithmétique.

1voto

YAB Points 76

Je pense que la réponse de Rutter devrait fonctionner dans mon cas. Voici ce que j'ai fini par faire avant de la lire :

filter {
  grep {
    match => { "message" => "...something identifying the message..." }
    drop => false
    add_tag => [ "MyMarker" ] 
  }
  if "MyMarker" in [tags] {
    grok {
      match => [ "message", "...(?<rawCurValue>[0-9,]+)K of (?<rawMaxValue>[0-9,]+)K..." ]
      break_on_match => false
    }
    if "_grokparsefailure" not in [tags] {
      ruby {
        code => "
           if(event['rawCurValue'])
             event['curValue'] = Integer(event['rawCurValue'].gsub(',','')) * 1000
           end
           if(event['rawMaxValue'])
             event['maxValue'] = Integer(event['rawMaxValue'].gsub(',','')) * 1000
           end
        "
      }
    }
  }
}

Je pense qu'il pourrait être plus concis, mais il semble fonctionner.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X