Как контролировать уровень отладочной информации в glib? - PullRequest
6 голосов
/ 22 сентября 2011

У меня есть библиотека, написанная на C с помощью glib / gobject. Он выдает значительное количество отладочной информации через g_debug() вызов. Эта информация очень полезна для устранения неполадок, однако я не хочу, чтобы она отображалась, когда библиотека включена в настоящее приложение. Итак, в основном мне нужен способ контролировать / фильтровать количество отладочной информации, и я не мог понять, как она должна работать с glib. Может ли кто-нибудь указать мне правильное направление, пожалуйста?

Ответы [ 2 ]

11 голосов
/ 22 сентября 2011

Вы можете попробовать установить переменную окружения G_DEBUG, как указано на сайте разработчика GLib. Пожалуйста, обратитесь к Environment variable раздел под Running and debugging GLib Applications в http://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), чтобы сделать это в своем коде. Изначально вы можете установить в качестве обработчика журнала фиктивную функцию, которая не отображает ничего, а затем вы можете установить обработчик журнала на 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;
}

Надеюсь, это поможет!

2 голосов
/ 19 ноября 2011

Я реализовал собственный обработчик журнала, и вот как это получилось:

void custom_log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
{
    gint debug_level = GPOINTER_TO_INT (user_data);

    /* filter out messages depending on debugging level */
    if ((log_level & G_LOG_LEVEL_DEBUG) && debug_level < MyLogLevel_DEBUG) {
        return;
    }
    else if ((log_level & G_LOG_LEVEL_INFO) && debug_level < MyLogLevel_INFO) {
        return;
    }

    g_printf ("%s\n", message);

}

int main(int argc, char *argv[])
{
    ...
    if (verbose) {
        g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_DEBUG));
    }
    else {
        g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_NORMAL));
    }
    ...
}

Надеюсь, это кому-нибудь пригодится: -)

...