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