2011-09-22 5 views
5

私はglib/gobjectでCで書かれたライブラリを持っています。これは、g_debug()呼び出しによってかなりの数のデバッグ情報を生成します。この情報はトラブルシューティングに非常に役立ちますが、実際のアプリケーションにライブラリが含まれている場合は表示したくありません。ですから、基本的には、デバッグ情報の量を制御/フィルタリングする方法が必要であり、glibでどのように動作するのか把握できませんでした。誰かが正しい方向に私を向けることができますか?glibのデバッグ情報のレベルを制御する方法は?

答えて

10

GLibデベロッパーサイトで述べたように、環境変数をG_DEBUGに設定してみることができます。 Running and debugging GLib ApplicationsEnvironment variableセクションのhttp://developer.gnome.org/glib/2.28/glib-running.htmlを参照してください。

EDIT:コード内のロガーを設定するために更新します。 コードでこれを行うにはg_log_set_handlerhttp://developer.gnome.org/glib/2.29/glib-Message-Logging.html#g-log-set-handler)を使用できます。最初に、ログハンドラをダミー関数&を表示するダミー関数に設定すると、適切なログレベルを設定するために渡された引数に基づいてログハンドラを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

ありがとう@ 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)); 
    } 
    ... 
} 

を、私はそれはそれは私が探しているまさにではありません

関連する問題