2011-09-22 10 views
5

Tengo una biblioteca escrita en C con glib/gobject. Produce una cantidad significativa de información de depuración a través de la llamada g_debug(). Esta información es muy útil para la solución de problemas, sin embargo, no quiero que se muestre, cuando la biblioteca se incluye con la aplicación real. Entonces, básicamente necesito una forma de controlar/filtrar la cantidad de información de depuración y no podría entender cómo se supone que debe funcionar con glib. ¿Podría alguien señalarme en la dirección correcta, por favor?¿Cómo controlar el nivel de información de depuración en glib?

Respuesta

10

Puede intentar configurar la variable de entorno G_DEBUG como se menciona en el sitio del desarrollador GLib. Consulte la sección Environment variable debajo de Running and debugging GLib Applications en http://developer.gnome.org/glib/2.28/glib-running.html.

EDITAR: Actualiza para configurar el registrador en el código. Puede usar g_log_set_handler (http://developer.gnome.org/glib/2.29/glib-Message-Logging.html#g-log-set-handler) para hacer esto en su código. Inicialmente, puede configurar el manejador de registros en una función ficticia que muestre nada &, luego puede configurar el manejador de registros en g_log_default_handler según el argumento aprobado para establecer los niveles de registro apropiados. Para establecer los niveles de registro por encima de un nivel establecido, deberá manipular los valores GLogLevelFlags según su necesidad.
espero que el ejemplo de código a continuación se proporcionan algunos punteros

#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; 
} 

Espero que esto ayude!

+1

no es exactamente lo que estoy buscando. Todo lo que quiero que pase -v tenga solo INFO y los mensajes anteriores que se mostrarán y -vv también incluirá la eliminación de fallas. Si no se proporciona ningún parámetro, solo muestre ADVERTENCIA y CRÍTICO. Básicamente, lo que estoy buscando es una forma de controlar esto desde la aplicación interna. Por lo que yo entiendo, la variable de entorno G_DEBUG es para diferentes propósitos. – dtoux

+0

Gracias @ another.anon.coward. Solo ahora noté tu edición y esta es exactamente la respuesta que estaba buscando. Bueno, en este momento he hecho exactamente lo mismo por mí mismo, pero gracias de todos modos ;-) – dtoux

1

he implementado manejador de registro personalizado y así es como se vio después:

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)); 
    } 
    ... 
} 

espero que será útil a alguien :-)

Cuestiones relacionadas