我有用glib/gobject用C編寫的庫。它通過調用g_debug()
產生大量的調試信息。此信息對於故障排除非常有幫助,但是我不希望在實際應用程序中包含庫時顯示此信息。所以,基本上我需要一種方法來控制/過濾大量的調試信息,我無法弄清楚它應該如何與glib一起工作。請有人指出我正確的方向嗎?如何控制glib中調試信息的級別?
5
A
回答
10
您可以嘗試設置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)在代碼中執行此操作。最初,您可以將日誌處理程序設置爲一個虛擬函數,該函數顯示nothings &,然後您可以根據爲設置適當的日誌級別傳遞的參數將日誌處理程序設置爲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;
}
希望這有助於!
1
我實現了自定義日誌處理程序,並在這裏是如何橫空出世:
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));
}
...
}
我希望這將有助於別人:-)
相關問題
- 1. 在控制檯輸出調試信息
- 2. Tcl:[信息級別]與[信息幀]
- 3. R中調試()的級別
- 4. 如何在llvm源代碼級調試信息中表示函數式語言調試信息?
- 5. 在C++庫中控制調試級別 - Linux
- 6. 調試信息
- 7. 調試信息
- 8. javax.net的調試信息未寫入Domino服務器控制檯
- 9. 如何通過C++代碼低級別調試COM DLL(Firefox插件)方法而無需調試信息?
- 10. 如何在glib中設置日誌級別
- 11. Clion:如何定義調試級別?
- 12. PHP Pear如何啓用調試級別?
- 13. 如何在c級別調試python?
- 14. -sass-調試信息
- 15. GCC調試信息
- 16. DLL調試信息
- 17. 如何在Eclipse中調試時將PHP消息記錄到調試控制檯?
- 18. 如何記錄ssh調試信息?
- 19. 如何重命名調試信息?
- 20. 如何調試使用調試信息編譯的共享庫
- 21. 使用AnkoLogger的級別不是「信息」
- 22. 如何在詳細信息中分配標題級別折扣
- 23. 低級別Android調試
- 24. 如何將日誌級別設置爲MongoDb的信息?
- 25. 如何將類型信息帶入Haskell的值級別?
- 26. 如何更改外部jar中的類的調試級別
- 27. 升級到ASP.NET Core 2.0後,Web API控制檯中的重複信息消息
- 28. 如何分別測試控制器?
- 29. Java日誌記錄 - 調試級別日誌未出現在eclipse控制檯中
- 30. 如何讓控制器中的用戶信息在rails中
這不正是我要找的。我希望能夠傳遞-v只有INFO和上面的消息才能顯示,-vv也包含調試。如果沒有提供參數,只顯示WARNING和CRITICAL。基本上,我正在尋找的是從應用程序內部控制這種方式。據我所知,G_DEBUG環境變量是出於不同的目的。 – dtoux
Thanks @ another.anon.coward。我現在才注意到你的編輯,這正是我正在尋找的答案。那麼,這一次我自己也完全一樣,但不過謝謝你;-) – dtoux