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
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!
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 :-)
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
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