IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

script sh analyse de logs


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Par défaut script sh analyse de logs
    Bonjour,
    Je cherche à faire un script qui analyserait des fichiers logs pour ne récupérer pour le moment que les lignes qui m'intéressent.

    Ce sont des logs du type :
    [1243769124] HOST ALERT: serveur2;UP;HARD;1;PING OK - Packet loss = 0%, RTA = 4.35 m
    [1243769176] SERVICE ALERT: serveur2;CPU Load;OK;HARD;1;OK - load average: 0.00, 0.00, 0.00

    Pour le moment, je cherche à récupérer les lignes qui se situent dans un intervalle de temps donné ainsi que le noms des serveurs correspondant aux noms présent dans un fichier.

    J'ai réussi à faire celà en faisant une première commande qui me récupère le nom des serveurs et qui m'enregistre le résultat dans un fichier texte et ensuite en analysant le temps de ce nouveau fichier.

    Cette solution n'est pas viable pour moi, car je peux avoir plus de 20Go de fichiers logs à parcourir. Cette méthode peut poser à terme un problème de place et de performances.
    Il faudrait que je n'ai à parcourir mon fichier log qu'une seule fois.

    J'ai fait pour filtrer le temps :
    awk /temps de début/,/temps de fin/' chemin de mon fichier log (a terme ce sera un fichier contenant le nom de tous mes fichiers logs à analyser)

    Pour filtrer par serveurs :
    egrep `sed ':a;N;$!ba;s/\n/\|/g' /tmp/serveurs.txt` chemin de mon fichier log

    Je n'arrive pas à trouver une solution pour faire les deux en une seule fois.

    Quelqu'un aurait une idée ?
    Je vous remercie.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 659
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    Voilà ce que j'ai compris (évidemment je peux me tromper) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash
     
    #set -x
     
    destLog="/chemin/fichier.out"
    listServers=( $(sed ':a;N;$!ba;s/\n/\|/g' /tmp/serveurs.txt) )
     
    for serveur in ${listServers[@]}
     do
       while read ligne
        do
          read champsDate nomServer <<< $(sed 's/^\[\([0-9]\{10\}\)].*: \([^;]*\);.*/\1 \2/' <<< "$ligne")
          if [ $champsDate -gt $dateMin -a $champsDate -lt $dateMax -a "$serveur" = "$nomserveur" ]
           then
             echo "$ligne" >> $destLog
          fi
       done < fichier.log
    done
    Bon, c'est du bash, ça risque de prendre des "plombes" sur 20Go de données, il faudrait pouvoir transposer, totalement, au moins en awk
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Fabinounours Voir le message
    Je n'arrive pas à trouver une solution pour faire les deux en une seule fois.
    Le problème, c'est que tes 2 commandes (grep et awk) parsent chacune le fichier dans son intégralité (et en plus t'utilises egrep qui est le plus long des 3).

    Si tu veux parser le fichier qu'une seule fois, faut le traiter à la main. N_Bah a donné une solution bash. Tu peux aller plus vite en Python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/env python
    # coding: Latin-1 -*-
     
    # Fonction qui analyse une ligne
    def is_good(ligne):
        travail d'analyse complet qui renvoie à la fin False ou True
        selon que la ligne corresponde ou pas
    # is_good()
     
    # Programme principal
    fp=open("chemin de mon fichier log", "r")
    for ligne in fp:
        if is_good(ligne): print ligne
    fp.close()
    Si la solution te convient et que tu veux plus d'aide sur la fonction "is_good", je la complèterai (ou d'autres le feront)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [bash] script qui analyse un fichier de log en live
    Par Merfolk dans le forum Linux
    Réponses: 1
    Dernier message: 24/05/2008, 14h26
  2. [Stratégie] Analyse de logs
    Par smux dans le forum Logging
    Réponses: 2
    Dernier message: 02/02/2006, 11h15
  3. [Log]Outil pour analyser les logs d'une appli J2EE
    Par sbelli dans le forum Logging
    Réponses: 1
    Dernier message: 18/01/2006, 10h20
  4. analyse de logs en perl
    Par sabbish dans le forum Langage
    Réponses: 11
    Dernier message: 26/10/2005, 13h15
  5. script d'analyse oracle : compute statistic
    Par davidudy dans le forum Administration
    Réponses: 7
    Dernier message: 05/08/2004, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo