【问题标题】:How to handle log level with GLib如何使用 GLib 处理日志级别
【发布时间】:2021-12-29 05:17:30
【问题描述】:

我想为我的 C 程序创建日志级别显示。

例如,如果使用./my_program -log=warning 启动它,它会在标准输出上显示我的警告日志。 ./my_program -log=debug./my_program -log=errors 相同。

我最初考虑在 C 中手动执行它并只使用一些 printf,但出于其他原因我也在程序中使用 GLib,我很确定它有自己的方法来处理问题。

所以我的问题是:如何使用 GLib 以干净、健壮的方式处理调试日志?

【问题讨论】:

    标签: c debugging logging glib


    【解决方案1】:

    可以,但不是直接的。

    两部分:

    • 调试消息
    • 其他消息。

    调试

    默认情况下,调试消息是隐藏的,您可以通过将环境变量 G_MESSAGES_DEBUG 设置为 all 来显示它们

    其他

    要隐藏其他消息,您可以使用g_log_set_handler定义自己的日志函数,该函数不会显示消息


    这个小代码会做你想做的事:

    #include <glib.h>
    
    /* a log function that will eat the message without displaying it */
    void log_quiet(const gchar* domain, GLogLevelFlags level, const gchar *message, gpointer user_data)
    {
        // nop
    }
    
    int main(int argc, char *argv[]) 
    {
    
        /* message filter */
        int filter = 0;
    
        /* decode argument given here, it's the first argument given */
        if (argc > 1)
        {
            if (0 == strcmp(argv[1], "debug")) {
                filter = G_LOG_LEVEL_DEBUG;
            } else if (0 == strcmp(argv[1], "debug")) {
                filter = G_LOG_LEVEL_DEBUG;
            } else if (0 == strcmp(argv[1], "message")) {
                filter = G_LOG_LEVEL_MESSAGE;
            } else if (0 == strcmp(argv[1], "warning")) {
                filter = G_LOG_LEVEL_WARNING;
            } else if (0 == strcmp(argv[1], "critical")) {
                filter = G_LOG_LEVEL_CRITICAL;
            } else if (0 == strcmp(argv[1], "error")) {
                filter = G_LOG_LEVEL_ERROR;
            }
        }
    
        
        /* set the message handler*/
        switch (filter) {
            case G_LOG_LEVEL_DEBUG:
                /* in case of debug, we must make it visible */
                setenv("G_MESSAGES_DEBUG", "all", 1);
                break;
            /* other case, hide messages progressively */
            case G_LOG_LEVEL_ERROR:
                g_log_set_handler(NULL, G_LOG_LEVEL_CRITICAL, log_quiet, NULL);
            case G_LOG_LEVEL_CRITICAL:
                g_log_set_handler(NULL, G_LOG_LEVEL_WARNING, log_quiet, NULL);
            case G_LOG_LEVEL_WARNING:
                g_log_set_handler(NULL, G_LOG_LEVEL_MESSAGE, log_quiet, NULL);
            case G_LOG_LEVEL_MESSAGE:
                g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, log_quiet, NULL);
        }
    
        /* test */
        g_debug("Hello from g_debug");
        g_message("Hello from g_message");
        g_warning("Hello from g_warning");
        g_critical("Hello from g_critical");
        g_error("Hello from g_error");
    
        return 0;
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2010-12-16
      相关资源
      最近更新 更多