2009-05-21 5 views
0

Der glib GLogLevelFlags Enum ist definiert als:Ist es möglich, dass ein Standard-Log-Handler in glib mehrere Log-Level passieren kann?

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; 

Ist es möglich, dass die default handler zu erhalten, zum Beispiel (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_DEBUG) als Protokollebene? Ist dies gemäß den API-Garantien von glib klar definiert?

Antwort

2

Ja - es ist. als G_LOG_LEVEL_MASK Sehen als eine bitweise Maske mit allen Bits definiert ist, aber 0 und 1 gesetzt ist, und

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

wird als ein Beispiel für das Hinzufügen eines Protokollhandler für alle Nachrichten von GLib verwendete Protokollebene kombiniert, ist in Ordnung.

Auch betrachten Sie das folgende Zitat für g_log_set_handler:

Legt die Protokollhandler für eine Domain und eine Reihe von Protokollebenen,

Schließlich this tutorial sehen, die unter anderen Staaten :

Der Parameter GLogLevelFlags ist eine Aufzählung von Bit-Flags, die das Zeichen und den bestimmten Kanal einer Protokollierungsnachricht definieren. Die drei, die Sie am wahrscheinlichsten mit Protokollierungshandlern verwenden werden, sind G_LOG_LEVEL_MESSAGE, G_LOG_LEVEL_WARNING und G_LOG_LEVEL_ERROR. Da es sich um Bit-Flags handelt, können Sie einen binären ODER-Operator verwenden, um mehr als einen Kanal zu einem einzelnen Handler zu kombinieren.

+0

Ja, die reden über das Einrichten von Handlern, aber es scheint nicht sinnvoll zu sein, dass eine bestimmte Nachricht zu mehreren Kanälen gehört, würde ich nicht denken? – bdonlan

+0

Sicher. Die Nachricht gehört nicht zu mehreren Kanälen. Der Handler akzeptiert Nachrichten, die zu einem der Kanäle gehören, für die er akzeptiert wurde. if: (message.channel & handler.accepted_channels) {// handle} – ASk