Возможно ли, чтобы обработчик журнала по умолчанию в glib проходил несколько уровней журнала? - PullRequest
0 голосов
/ 21 мая 2009

Перечисление 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;

Можно ли обработчику по умолчанию получить, например, (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_DEBUG) в качестве уровня журнала? Это четко определено в соответствии с гарантиями API glib?

1 Ответ

2 голосов
/ 21 мая 2009

Да, это так. Вид 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:

Устанавливает обработчик журнала для домена и набор уровней журнала

Наконец, см. этот урок , в котором, среди прочего, говорится:

Параметр GLogLevelFlags представляет собой перечисление битовых флагов, которые определяют символ и конкретный канал сообщения регистрации. Три наиболее вероятных варианта использования с обработчиками журналирования: G_LOG_LEVEL_MESSAGE, G_LOG_LEVEL_WARNING и G_LOG_LEVEL_ERROR. Поскольку они являются битовыми флагами, вы можете использовать двоичный оператор ИЛИ для объединения нескольких каналов в один обработчик.

...