ACE_DEBUG 常規的一些輸出訊息
ACE_ERROR 會提供者出錯的一些低級訊息
2個宏的用法上是一致的
ACE_DEBUG(錯誤層級,"格式串",變數1...變數N)
其中部分錯誤層級系統定義如下:
LM_SHUTDOWN = 01,系統死機層級
LM_TRACE = 02,追蹤層級
LM_DEBUG = 04,DEBUG層級
LM_INFO = 010,常規資訊層級
LM_NOTICE = 020,注意層級
LM_WARNING = 040,警告層級
LM_STARTUP = 0100,啟動層級
LM_ERROR = 0200,錯誤層級
LM_CRITICAL = 0400,危急層級
LM_ALERT = 01000,可修複的警告層級
LM_EMERGENCY = 02000,全域警告層級
部分格式串使用如下:
跟c 中printf使用類似
%n-表當前程式名稱
%t-表當前線程號
%p-表指標
%s-字串
ACE通過全域單體執行個體 ACE_LOG_MSG 管理和控制輸出,我們可以利用這個執行個體把輸出重新導向
到檔案,也可以重新導向到標誌輸出
其中還可以控制什麼層級的訊息可被輸出,簡單使用如下:
ACE_LOG_MSG->set_flags (ACE_Log_Msg::STDERR);
設定輸出到標準錯誤輸出
ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR);
關閉輸出到標誌錯誤輸出
ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
ofstream myostream (filename, ios::out | ios::trunc);
ACE_LOG_MSG->msg_ostream (&myostream);
設定輸出到檔案
u_long priority_mask =ACE_LOG_MSG->priority_mask (ACE_Log_Msg::PROCESS);
ACE_SET_BITS (priority_mask,LM_DEBUG |LM_INFO);
設定只記錄LM_DEBUG 或者LM_INFO層級的訊息
ACE_CLR_BITS (priority_mask,LM_DEBUG | LM_INFO);
清除設定條件
ACE_LOG_MSG還有一個非常有意思的功能,能以16進位方式輸出記憶體中的塊 ,簡單使用如下:
ACE_LOG_MSG->log_hexdump (LM_DEBUG,
(char *) array,
sizeof array);
下面附上一個使用例子,例子來源於ACE包中的例子程式
#include "ace/OS_main.h"
#include "ace/streams.h"
#include "ace/Log_Msg.h"
int
ACE_TMAIN (int, ACE_TCHAR *[])
{
// 這個訊息將輸出到STDERR
ACE_DEBUG ((LM_DEBUG,
"first message/n"));
ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR);
// 這個訊息將不被輸出,因為標誌位清除了
ACE_DEBUG ((LM_DEBUG,
"second message/n"));
ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
//這個訊息將不被輸出,因為流的實體尚未定義
ACE_DEBUG ((LM_DEBUG,
"third message/n"));
//建立一個流實體,指向d:/output.log檔案
const char *filename = "d://output.log";
ofstream myostream (filename, ios::out | ios::trunc);
if (myostream.bad ())
return 1;
// 設定輸出到流
ACE_LOG_MSG->msg_ostream (&myostream);
//這個訊息將輸出到檔案中
ACE_DEBUG ((LM_DEBUG,
"fourth message/n"));
ACE_LOG_MSG->set_flags (ACE_Log_Msg::STDERR);
// 這個訊息將同時輸出到檔案和STDERR
ACE_DEBUG ((LM_DEBUG,
"fifth message/n"));
return 0;
}