我原先不喜歡加 Log,后來我的頭兒希望加 Log,于是乎我手頭的項目就全是 Log 了。之前一直是定義一個不定參數的宏或者函數,遇到需要的地方就 LOG(...)。后來越來越感覺對于函數進出的信息比較渴求,于是弄了個固定的 LOG_FUNCTION() 來記錄函數進入,因為有 __FUNCTION__ 嘛。
對于函數出口,原先一直是手寫的,剛剛前幾天在這里討論的資源釋放問題讓我學到了新的解決方法——使用類似 Loki::ScopeGuard 的機制來輸出函數退出。
晚上重新寫了一下。見 http://code.google.com/p/xllog/。
使用如下:
void bar()
{
XL_LOG_FUNCTION();
XL_LOG(L"%s\n", L"In function bar.");
}
void foo()
{
XL_LOG_FUNCTION();
XL_LOG(L"%s\n", L"In function foo.");
bar();
}
int main()
{
XL_LOG_FUNCTION();
foo();
return 0;
}
運行結果:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Enter Function main
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Enter Function foo
In function foo.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Enter Function bar
In function bar.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Leave Function bar
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Leave Function foo
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Leave Function main
基本功能我自己已經可以接受了。
有兩點我想改進的,不知道能不能實現:
1、每個用到的函數寫一句 XL_LOG_FUNCTION() 太麻煩了,而且有可能被用戶寫到任意地方,而非函數開始。有沒有一種機制,使得可以寫成類似(要保持函數定義的形式,不要把函數名括號括起來):
void __log foo()
{
}
從而被展開成:
void foo()
{
XL_LOG_FUNCTION();
}
呢?
或者有沒有一種方法可以不用寫任何東西就讓每個函數體自動加上這么一句呢?
2、我想記錄函數的調用層次。如果上面行能夠實現的話,就沒問題了,我可以自己記錄函數進出次數。如果不能,那么依靠用戶寫 XL_LOG_FUNCTION() 來記錄就不可靠了。有沒有類似 __CALL_STACK_DEPTH__ 的預定義宏呢?
最后還有一個實際問題。實際使用中,在寫代碼的時候可能無法確定所寫部位到底是偏底層還是偏上層。如果太偏底層而打了 Log,會輸出很多 Log 干擾分析;如果太高層的而沒打 Log,有可能遇到問題信息不足。這個問題該如何解決好呢?大家有沒有成熟的解決思路呢?
posted on 2010-04-04 01:31
溪流 閱讀(2375)
評論(14) 編輯 收藏 引用 所屬分類:
C++