2011-09-22 118 views
5

我有用glib/gobject用C編寫的庫。它通過調用g_debug()產生大量的調試信息。此信息對於故障排除非常有幫助,但是我不希望在實際應用程序中包含庫時顯示此信息。所以,基本上我需要一種方法來控制/過濾大量的調試信息,我無法弄清楚它應該如何與glib一起工作。請有人指出我正確的方向嗎?如何控制glib中調試信息的級別?

回答

10

您可以嘗試設置G_DEBUG環境變量,如GLib開發人員站點中所述。請參閱Environment variable中的Running and debugging GLib Applications下的http://developer.gnome.org/glib/2.28/glib-running.html

編輯:更新以在代碼中設置記錄器。 您可以使用g_log_set_handlerhttp://developer.gnome.org/glib/2.29/glib-Message-Logging.html#g-log-set-handler)在代碼中執行此操作。最初,您可以將日誌處理程序設置爲一個虛擬函數,該函數顯示nothings &,然後您可以根據爲設置適當的日誌級別傳遞的參數將日誌處理程序設置爲g_log_default_handler。要將日誌級別設置爲設置級別以上,您需要根據需要操作GLogLevelFlags值。
希望下面的代碼示例將提供一些指引

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

希望這有助於!

+1

這不正是我要找的。我希望能夠傳遞-v只有INFO和上面的消息才能顯示,-vv也包含調試。如果沒有提供參數,只顯示WARNING和CRITICAL。基本上,我正在尋找的是從應用程序內部控制這種方式。據我所知,G_DEBUG環境變量是出於不同的目的。 – dtoux

+0

Thanks @ another.anon.coward。我現在才注意到你的編輯,這正是我正在尋找的答案。那麼,這一次我自己也完全一樣,但不過謝謝你;-) – dtoux

1

我實現了自定義日誌處理程序,並在這裏是如何橫空出世:

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

我希望這將有助於別人:-)