服務器程序經常需要在命令行中顯示錯誤消息、狀態或者用來跟蹤程序的執行路徑,最簡單的方法是使用printf。
ACE提供了更強大日志設施:
1、可以在編譯時啟用或禁用宏;
2、可以動態的啟用或禁用宏;
3、支持日志嚴重級別;
4、支持日志重定向;
5、支持多線程安全和線程級配置;
使用ACE的日志相關功能,需要引入<ace/Log_Msg.h>頭文件。
ACE日志輸出
ACE提供了兩個宏來支持日志輸出:ACE_DEBUG、ACE_ERROR。
這兩個宏的內部實現和行為都是一樣,只是為了在語義上區分調試信息和錯誤信息。
在引入<ace/Log_Msg.h>頭文件前添加以下定義可以關閉日志輸出,ACE_DEBUG、ACE_ERROR將被替換為空語句:
#define ACE_NLOGGING 1
ACE_DEBUG、ACE_ERROR的使用示例:
ACE_DEBUG((LM_STARTUP, ACE_TEXT("Startup.\n"))); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("hook2: %d\n"), *paramp)); ACE_ERROR((LM_ERROR, ACE_TEXT("config file %s is not found.\n"), szConfigFile.c_str())
使用ACE_DEBUG、ACE_ERROR宏需要注意的地方是需要使用兩對括號來包過參數。
第一個參數是嚴重級別,ACE可配置日志嚴重級別來顯示或關閉該級別的日志輸出:
LM_DEBUG、LM_ERROR、LM_INFO、LM_ALERT、LM_WARNING等,級別沒有優先級之分,最常用的是LM_DEBUG、LM_ERROR。
第二個參數支持格式化字符串,常用的指令集:
%A:浮點數
%s:字符串
%d:十進制數
%M:嚴重級別
%N:文件名稱
%P:進程ID
%t:線程ID
%D:當前時間
%I:縮進
ACE調用跟蹤
ACE定義了ACE_TRACE宏用於跟蹤函數的調用,具體說就是在其定義的地方產生輸出,在退出其作用域時產生另一條輸出。
ACE_TRACE的實現是被展開為一個棧上的對象,在其構造和析構函數中分別輸出日志。
void foo() { ACE_TRACE(ACE_TEXT("foo\n")) int a = 0; int b = 0; int c = b; }
ACE_TRACE只接收單個字符串,不支持格式化字符串,輸出的日志嚴重級別為LM_TRACE。
ACE_TRACE默認是禁用的,網上經常有朋友反映看不到ACE_TRACE的輸出,而很多回答也是錯的,單純在項目中定義#define ACE_NTRACE 0也是無法起作用的。
必須在ace/config.h頭文件中,在引用其他頭文件前定義並且重新編譯ACE庫:
#define ACE_NTRACE 0
記錄,為更好的自己!轉載請注明出處!