如何控制glib中的调试信息级别?

dto*_*oux 6 c glib

我有一个用C语言编写的库和glib/gobject.它通过g_debug()调用产生大量的调试信息.此信息对于故障排除非常有用,但是当实际应用程序包含库时,我不希望它显示.所以,基本上我需要一种方法来控制/过滤调试信息量,我无法弄清楚它应该如何与glib一起使用.有人能指出我正确的方向吗?

ano*_*ard 11

您可以尝试设置开发人员站点中G_DEBUG提到的环境变量GLib.请参考Environment variable部分下Running and debugging GLib Applicationshttp://developer.gnome.org/glib/2.28/glib-running.html.

编辑:更新以在代码中设置记录器.您可以使用g_log_set_handler(http://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;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!