glib中的默认日志处理程序是否可以传递多个日志级别?

时间:2009-05-21 04:07:27

标签: logging glib

glib GLogLevelFlags枚举定义为:

typedef enum
{
  /* log flags */
  G_LOG_FLAG_RECURSION          = 1 << 0,
  G_LOG_FLAG_FATAL              = 1 << 1,

  /* GLib log levels */
  G_LOG_LEVEL_ERROR             = 1 << 2,       /* always fatal */
  G_LOG_LEVEL_CRITICAL          = 1 << 3,
  G_LOG_LEVEL_WARNING           = 1 << 4,
  G_LOG_LEVEL_MESSAGE           = 1 << 5,
  G_LOG_LEVEL_INFO              = 1 << 6,
  G_LOG_LEVEL_DEBUG             = 1 << 7,

  G_LOG_LEVEL_MASK              = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)
} GLogLevelFlags;

default handler是否可以接收(例如)(G_LOG_LEVEL_ERROR | G_LOG_LEVEL_DEBUG)作为其日志级别?这是根据glib的API guarentees明确定义的吗?

1 个答案:

答案 0 :(得分:2)

是的 - 确实如此。 看作G_LOG_LEVEL_MASK被定义为一个按位掩码,所有位都设置为0和1,

  g_log_set_handler ("GLib", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL
                 | G_LOG_FLAG_RECURSION, my_log_handler, NULL);

用作为来自GLib的所有消息添加日志处理程序的示例,组合日志级别很好。

另外,请考虑g_log_set_handler的以下引用:

  

设置域的日志处理程序和一组日志级别

最后,请参阅this tutorial,其中包括:

  

GLogLevelFlags参数是位标志的枚举,用于定义日志消息的字符和特定通道。您最有可能使用日志处理程序的三个是G_LOG_LEVEL_MESSAGEG_LOG_LEVEL_WARNINGG_LOG_LEVEL_ERROR。由于它们是位标志,因此您可以使用二进制OR运算符将多个通道组合到单个处理程序中。