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

Shell et commandes GNU Discussion :

formater un message de log


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Par défaut formater un message de log
    Bonjour,

    J'ai actuellement plusieurs scripts bash dont certains peuvent être assez long et tous possèdent de nombreux cas d'erreur qu'il est rarement possible de résoudre à l'intérieur même du script (permissions d'accès aux fichier, ...). J'ai donc rajouter la commande suivante au début de mes scripts pour logger les différentes erreurs dans un fichier :
    où $log représente un chemin vers mon fichier de log. Jusque là tout fonctionne.

    Mais comme j'ai plusieurs scripts tournant en cronjob toutes les nuits, j'aimerais pouvoir rajouter avant chaque entrée une chaine spécifique pour pouvoir identifier mon script et préciser qu'il s'agit d'une erreur. (En cas de problème, grep est mon ami pour parser le fichier de log et m'aider à trouver la cause du problème)
    En bonus j'aimerais également pouvoir rajouter la date et heure au moment d'effectuer le log (et pas au moment de d'initialiser le script sinon ce serait trop facile ).

    J'ai donc essayé de partir sur quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec 2> echo 'CRONJOB:nomduscript.sh:ERROR ; '$(date)' '$0 >> $log
    avec diverses variantes, mais bien sur çà ne fonctionne pas absolument pas. J'imagine que je dois utiliser une autre commande que 'echo', et qu'il y a probablement des erreurs de syntaxe. Pourriez m'orienter dans la bonne direction svp ?

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Comment est le script ?

    si il utilises des fonctions
    tu peux rediriger ou tunneler les retours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mafocntion()
    {
    ....
    } | echo "........................" >> LOG
    utilise exec sur le script appelant comme tu tentes de le faire, j'ai jamais essayé, c'est pas forcément illogique mais j'ignore si cette méthode fonctionne donc je propose plus simple

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Et en utilisant la commande "trap" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #! /bin/bash
    
    trap 'echo "$(date +"%A %d %B %Y %T") : ERROR PROGRAMME $0 : LIGNE : $LINENO" >> fich.log' ERR

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Et en utilisant la commande "trap" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #! /bin/bash
    
    trap 'echo "$(date +"%A %d %B %Y %T") : ERROR PROGRAMME $0 : LIGNE : $LINENO" >> fich.log' ERR
    bien vu ça doit marcher..

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    Bonjour,

    je ne crois pas
    trap -l ne montre pas de signal ERR que trap pourrait intercepter(?).

    pour un debuggage ponctuel, on pourrait avoir une option (ou un test sur "$-" pour savoir s'il comporte "x") qui place set -x, initialise PS4 pour être adaptée à la sortie désirée, et rediriger la sortie d'erreur dans un fichier log...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    je ne crois pas
    trap -l ne montre pas de signal ERR que trap pourrait intercepter(?)
    Chez moi non plus et pourtant ça marche

    Normalement c'est pour du ksh, mais avec bash ça marche aussi...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    évidemment...
    si je ne lis pas le fichier de log, je ne verrai jamais que ça a fonctionné.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Par défaut
    Bonsoir,

    Merci pour vos nombreuses réponses.

    @frp31 :
    Il s'agit en réalité de plusieurs scripts bash tournant en cronjob chaque nuit. Parmi leurs différentes tâches il y a nettoyer les vieilles images du cache du serveur WEB (ce qui implique l'utilisation de la commande rm, ainsi qu'une connexion en base de donnée), et réaliser des fichiers de statistiques ce qui implique l'utilisation de commandes touch, de nombreuses commandes de formatages et de calcul et l'accès à une base de données également.

    Mettre des tests sur les valeurs de retour de chaque commande n'est pas une bonne idée car je pourrais rarement traiter l'erreur au sein même du script (exemple : une commande rm ne pouvant s'exécuter car après une mise à jour du site, les droits d'écriture pour le script ont disparu, un changement de la structure de la BDD et un oubli de mise à jour du script, etc.) et celà rendra mes scripts très rapidement illisible.

    L'utilisation de la commande exec me permet de rediriger stderr vers mon fichier de log pour toute la durée d'exécution de mon script, ce qui est très pratique puisque je n'ai plus besoin de tester chaque valeur de retour de chaque commande pour y implémenter mon écriture vers mon fichier de log.


    Je n'utilise pas de fonction actuellement dans mes scripts, mais celà peut être une bonne idée vu que je n'arrive pas à faire ce que je veux avec echo.
    Je viens donc de tester ce script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!bin/sh
     
    mafonction()
    {
    	read pipe
    	echo 'CRONJOB : test.sh : ERROR ; '$(date)' '$pipe >> ./test.log
    }
     
    exec 2>> mafonction()
     
    rm bidouille
    manque de chance j'obtiens une erreur de syntaxe... Y-a-t-il un moyen de rediriger stderr vers mafonction() ?!?

    @zipe31 :
    Je n'ai actuellement pas de man page pour la commande trap sur ma debian (fraichement mise à jour) mais après test, c'est effectivement de çà dont j'aurais besoin. Il ne me reste plus qu'à lire la man page sur le net et trouver un équivalent pour sh (et non pas bash, dsl pour l'erreur de débutant )

    En remplaçant le exec par la ligne que tu m'a fourni dans le mini-script précédent j'obtiens la sortie suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mardi 05 juillet 2011 18:42:34 : ERROR PROGRAMME test.sh : LIGNE : 11
    Ce qui est presque ce que je veux, il ne me manque que le message d'erreur de ma commande rm à concaténer à la fin.

    Merci beaucoup ! Je poste la solution complète avec sh dès que j'ai trouvé, il commence à ce faire un peu tard pour ce soir.

    P.S. :
    J'ai remarqué le thread "trucs et astuces" épingler en haut de cette section du forum. Ca me parait être une entrée intéressante. zipe31, as-tu le temps d'y rédiger un message ? Sinon je le ferais en citant ton pseudo.

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Ce qui est presque ce que je veux, il ne me manque que le message d'erreur de ma commande rm à concaténer à la fin.
    Suffit de rajouter "2>>fich.log" après tes commandes "rm" et le "trap" interceptera le message initial d'erreur.
    Seul inconvénient le message d'erreur dans le fichier de log sera avant l'alerte

    Merci beaucoup ! Je poste la solution complète avec sh dès que j'ai trouvé
    De rien et merci d'avance

    P.S. :
    J'ai remarqué le thread "trucs et astuces" épingler en haut de cette section du forum. Ca me parait être une entrée intéressante. zipe31, as-tu le temps d'y rédiger un message ? Sinon je le ferais en citant ton pseudo.
    Tu peux le faire, et pas la peine d'y rajouter mon pseudo, je n'aspire pas à la postérité , le principal est que l'information existe

Discussions similaires

  1. Enregistrer plusieurs Emails en format de message Outlook
    Par Myogtha dans le forum VBA Outlook
    Réponses: 6
    Dernier message: 23/06/2016, 17h57
  2. format de message DSN exchange, accusé de remise
    Par lib.jar dans le forum Exchange Server
    Réponses: 0
    Dernier message: 16/11/2007, 16h49
  3. LPRng et message de log
    Par dd_angel dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 15/10/2007, 10h54
  4. OUTLOOK 2002, Format du message
    Par vignoc dans le forum Outlook
    Réponses: 1
    Dernier message: 22/04/2007, 12h30
  5. [JMS] [MQ] Format de message
    Par PoyPoy dans le forum Websphere
    Réponses: 1
    Dernier message: 18/01/2007, 12h11

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