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

C Discussion :

Ajout macros __FILE__ et __LINE__ dans message syslog


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Par défaut Ajout macros __FILE__ et __LINE__ dans message syslog
    Bonjour,

    Jusque là pour suivre le déroulement d'un code, j'utilise un affichage avec des printf avec la macro msg() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int pmesg(int level, int service, char* format, ...);
     
        #define msg(...) do{if(pmesg(__VA_ARGS__)) fprintf(stderr, " (%s, line %d, %s)\n", __FILE__, __LINE__, __func__);} while(0)
    Maintenant, je souhaiterai ne plus utiliser les fonctions printf mais syslog de linux. J'ai réussi à utiliser syslog et vsyslog dans pmesg(), mais je ne vois pas comment récupérer __VA_ARGS__ et les macros __FILE__, __LINE__ pour générer un affichage syslog sur une même ligne.

    En deux fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int pmesg(const char *file, int line, int level, int service, char* format, ...);
     
    #define msg(...) do{pmesg(__FILE__, __LINE__, __VA_ARGS__);} while(0)
     
     
    int pmesg(const char *file, int line, int level, int service, char* format, ...) {
            //...
            va_start(args, format);
            syslog(LOG_LOCAL0|LOG_DEBUG, "message de test %s %d", file, line);
            vsyslog(LOG_LOCAL0|LOG_NOTICE, format, args);
            va_end(args);
            //...
    }
    Auriez-vous une idée pour concaténer les deux parties du message ?
    Merci

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vincenet Voir le message
    Auriez-vous une idée pour concaténer les deux parties du message ?
    Bonjour

    A tout hasard, sprintf() pour "construire" un nouveau format en utilisant les deux premiers
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char reformat[1024];
    sprintf(reformat, "message de test %%s %%d %s", format)
    syslog(LOG_LOCAL0|LOG_DEBUG, reformat, file, line, args);
    Et si sprintf() n'accepte pas les "%" situés dans le champ "format" alors utiliser strcpy() + strcat()...
    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]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Par défaut
    J'aurai souhaité ne pas créer une variable locale pour la chaîne et devoir contrôler les dépassements, mais dans le principe ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            char reformat[1024];
            char tailformat[256];
            sprintf(tailformat, " (%s, line %d)", file, line);
            va_start(args, format);
            vsprintf(reformat, format, args);
            strcat(reformat, tailformat);
            syslog(LOG_LOCAL0|LOG_DEBUG, reformat);
            va_end(args);
    Plus qu'à utiliser les versions limitant le nombre de caractères pour les fonctions printf (vsnprintf() au lieu de vsprintf() ...).
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #define MSG_SIZE 10
    #define TAIL_SIZE 10
            va_start(args, format);
            char reformat[MSG_SIZE+TAIL_SIZE];
            char tailformat[TAIL_SIZE];
            snprintf(tailformat, TAIL_SIZE, " (%s, line %d)", file, line);
            if(vsnprintf(reformat, MSG_SIZE+TAIL_SIZE, format, args) < MSG_SIZE+TAIL_SIZE)
            {
                    strncat(reformat, tailformat, MSG_SIZE+TAIL_SIZE);
            }
            syslog(LOG_LOCAL0|LOG_DEBUG, reformat);
            va_end(args);
    Je vous laisse ajuster la taille des tableaux ;-)

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu pourrais faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vsyslog(LOG_LOCAL0|LOG_DEBUG, "message de test %s %d : " format, file, line, args);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Tu pourrais faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vsyslog(LOG_LOCAL0|LOG_DEBUG, "message de test %s %d : " format, file, line, args);
    L'idée me séduit, as-tu bien vu ça dans un code C ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    myLib.c: In function 'pmesg':
    myLib.c:173:66: error: expected ')' before 'format'
             vsyslog(LOG_LOCAL0|LOG_DEBUG, "message de test %s %d : " format, file, line, args);
                                                                      ^
    myLib.c:173:66: error: too few arguments to function 'vsyslog'
    In file included from /home/vincent/oe_daisy/oecore/sysroots/armv5te-oe-linux-gnueabi/usr/include/syslog.h:1:0,
                     from myLib.h:16,
                     from myLib.c:4:
    /home/vincent/oe_daisy/oecore/sysroots/armv5te-oe-linux-gnueabi/usr/include/sys/syslog.h:200:13: note: declared here
     extern void vsyslog (int __pri, const char *__fmt, __gnuc_va_list __ap)

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par vincenet Voir le message
    L'idée me séduit, as-tu bien vu ça dans un code C ?
    arf.... j'ai écrit trop vite sans vérifier et en lisant la question en diagonale...
    J'ai développé une librairie de log utilisée sur plusieurs projets. Je passe par ma fonction intermédiaire et ensuite une chaine de 1 Ko pour construire la ligne de log.
    C'est ma fonction de log qui est utilisable comme ça donc c'est assez éloigné de ta question initiale

    Mais le principe de base dans ma librairie est d'utiliser les MACRO. Exemple :
    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
    19
    20
    21
    22
    23
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdarg.h>
     
    #define CHAINE_GEANTE 2048
     
    void mon_log( char * format, ... )
    {
        va_list args;
        va_start( args, format);
        vprintf( format, args );
        va_end( args );
    }
     
    #define INFO_LOG( format, ar... ) mon_log( "ligne %d, fonction %s : "format"\n", __FILE__, __FUNCTION__, ##ar )
     
    int main()
    {
        INFO_LOG( "salut %d, ca roule ? %s", 56, "hello" );
        char chaine[] = "coucou";
        INFO_LOG( "%s", chaine );
        exit( 0 );
    }
    Il faut passer par une macro et une fonction.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

Discussions similaires

  1. Macro : Extraire une donnée dans un message
    Par roidurif dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/04/2011, 13h15
  2. ajout macro complémentaire dans menu
    Par spidtrip dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 06/07/2010, 15h12
  3. Ajouter macro dans document word
    Par ac/dc dans le forum C#
    Réponses: 4
    Dernier message: 14/11/2008, 17h25
  4. Ajout d'une case à cocher dans un message box
    Par Jahjouh dans le forum MFC
    Réponses: 1
    Dernier message: 31/08/2007, 11h46

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