2011-09-22 18 views
5

Tôi có một thư viện được viết bằng C với glib/gobject. Nó tạo ra số lượng đáng kể thông tin gỡ lỗi qua cuộc gọi g_debug(). Thông tin này rất hữu ích để khắc phục sự cố, tuy nhiên tôi không muốn nó được hiển thị, khi thư viện được bao gồm trong ứng dụng thực tế. Vì vậy, về cơ bản tôi cần một cách để kiểm soát/lọc số lượng thông tin gỡ lỗi và tôi không thể tìm ra cách nó phải làm việc với glib. Ai đó có thể chỉ cho tôi đi đúng hướng không?Làm thế nào để kiểm soát mức độ thông tin gỡ lỗi trong glib?

Trả lời

10

Bạn có thể thử đặt biến môi trường G_DEBUG như được đề cập trong trang web nhà phát triển GLib. Vui lòng tham khảo phần Environment variable dưới Running and debugging GLib Applications trong http://developer.gnome.org/glib/2.28/glib-running.html.

EDIT: Cập nhật để đặt trình ghi nhật ký trong mã. Bạn có thể sử dụng g_log_set_handler (http://developer.gnome.org/glib/2.29/glib-Message-Logging.html#g-log-set-handler) để thực hiện việc này trong mã của mình. Ban đầu, bạn có thể đặt trình xử lý nhật ký thành hàm giả hiển thị thông báo & sau đó bạn có thể đặt trình xử lý nhật ký thành g_log_default_handler dựa trên đối số được truyền cho đặt mức nhật ký thích hợp. Để thiết lập các mức log ở trên một mức thiết lập, bạn sẽ cần phải thao tác các giá trị GLogLevelFlags theo nhu cầu của bạn.
Hy vọng những mẫu mã dưới đây sẽ cung cấp một số gợi ý

#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; 
} 

Hope this helps!

+1

Nó không phải là chính xác những gì tôi đang tìm kiếm. Tất cả tôi muốn để có thể vượt qua -v chỉ có các thông điệp INFO và ở trên được hiển thị và -vv cũng bao gồm gỡ lỗi. Nếu không có tham số nào được cung cấp, chỉ hiển thị CẢNH BÁO và CHÉP. Về cơ bản, những gì tôi đang tìm kiếm là một cách để kiểm soát điều này từ bên trong ứng dụng. Theo tôi hiểu, biến môi trường G_DEBUG là cho các mục đích khác nhau. – dtoux

+0

Cảm ơn @ another.anon.coward. Bây giờ tôi mới nhận thấy bản chỉnh sửa của bạn và đây chính là câu trả lời tôi đang tìm kiếm. Vâng, bởi thời gian này tôi đã thực hiện chính xác giống nhau của bản thân mình nhưng cảm ơn bạn Tuy nhiên ;-) – dtoux

1

tôi thực hiện xử lý log tùy chỉnh và đây là cách nó bật ra:

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)); 
    } 
    ... 
} 

Tôi hy vọng nó sẽ rất hữu ích cho ai đó :-)

Các vấn đề liên quan