2011-09-22 7 views
5

Ho una libreria scritta in C con glib/gobject. Produce un numero significativo di informazioni di debug tramite la chiamata g_debug(). Questa informazione è molto utile per la risoluzione dei problemi, tuttavia non voglio che venga mostrata, quando la libreria è inclusa nell'applicazione reale. Quindi, fondamentalmente ho bisogno di un modo per controllare/filtrare la quantità di informazioni di debug e non riesco a capire come dovrebbe funzionare con glib. Qualcuno potrebbe indicarmi la direzione giusta, per favore?Come controllare il livello delle informazioni di debug in glib?

risposta

10

Si potrebbe provare a impostare la variabile di ambiente G_DEBUG come indicato nel sito di sviluppo GLib. Fare riferimento alla sezione Environment variable nella sezione Running and debugging GLib Applications in http://developer.gnome.org/glib/2.28/glib-running.html.

MODIFICA: Aggiorna per impostare il registratore nel codice. È possibile utilizzare g_log_set_handler (http://developer.gnome.org/glib/2.29/glib-Message-Logging.html#g-log-set-handler) per eseguire questa operazione nel codice. Inizialmente è possibile impostare il gestore di registri su una funzione fittizia che visualizza le note &, quindi è possibile impostare il gestore di registri su g_log_default_handler in base all'argomento passato per impostare i livelli di registro appropriati. Per impostare i livelli di registro al di sopra di un livello impostato, sarà necessario modificare i valori GLogLevelFlags secondo le proprie necessità.
Spero che il codice di esempio qui sotto fornirà alcune indicazioni

#include <glib.h> 
#include <stdio.h> 
#include <string.h> 

#define G_LOG_DOMAIN ((gchar*) 0) 

static void _dummy(const gchar *log_domain, 
        GLogLevelFlags log_level, 
        const gchar *message, 
        gpointer user_data) 

{ 
    /* Dummy does nothing */ 
    return ;  
} 

int main(int argc, char **argv) 
{ 
    /* Set dummy for all levels */ 
    g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, _dummy, NULL); 
    /* Set default handler based on argument for appropriate log level */ 
    if (argc > 1) 
    { 
     /* If -vv passed set to ONLY debug */ 
     if(!strncmp("-vv", argv[1], 3)) 
     { 
      g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, g_log_default_handler, NULL); 
     } 
     /* If -v passed set to ONLY info */ 
     else if(!strncmp("-v", argv[1], 2)) 
     { 
      g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, g_log_default_handler, NULL); 
     } 
     /* For everything else, set to back to default*/ 
     else 
     { 
       g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, g_log_default_handler, NULL); 
     } 

    } 
    else /* If no arguments then set to ONLY warning & critical levels */ 
    { 
     g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING| G_LOG_LEVEL_CRITICAL, g_log_default_handler, NULL); 
    } 

    g_warning("This is warning\n"); 
    g_message("This is message\n"); 
    g_debug("This is debug\n"); 
    g_critical("This is critical\n"); 
    g_log(NULL, G_LOG_LEVEL_INFO , "This is info\n"); 
    return 0; 
} 

Spero che questo aiuti!

+1

non è esattamente quello che sto cercando. Tutto quello che voglio essere in grado di passare -v ha solo INFO e messaggi sopra per essere mostrato e -vv per includere anche il debug. Se nessun parametro fornito mostra solo AVVISO e CRITICO. Fondamentalmente, quello che sto cercando è un modo per controllarlo dall'interno dell'applicazione. Per quanto ho capito, la variabile d'ambiente G_DEBUG ha scopi diversi. – dtoux

+0

Grazie @ another.anon.coward. Ho solo notato la tua modifica e questa è esattamente la risposta che stavo cercando. Bene, in questo momento ho fatto esattamente lo stesso da solo, ma grazie comunque ;-) – dtoux

1

ho implementato gestore di log personalizzato ed ecco come si è scoperto:

void custom_log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data) 
{ 
    gint debug_level = GPOINTER_TO_INT (user_data); 

    /* filter out messages depending on debugging level */ 
    if ((log_level & G_LOG_LEVEL_DEBUG) && debug_level < MyLogLevel_DEBUG) { 
     return; 
    } 
    else if ((log_level & G_LOG_LEVEL_INFO) && debug_level < MyLogLevel_INFO) { 
     return; 
    } 

    g_printf ("%s\n", message); 

} 

int main(int argc, char *argv[]) 
{ 
    ... 
    if (verbose) { 
     g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_DEBUG)); 
    } 
    else { 
     g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_NORMAL)); 
    } 
    ... 
} 

Spero che sarà utile a qualcuno :-)