ACE服務端程式設計5 ACE日誌輸出和跟蹤

2022-05-03 06:15:05 字數 1491 閱讀 2678

伺服器程式經常需要在命令列中顯示錯誤訊息、狀態或者用來跟蹤程式的執行路徑,最簡單的方法是使用printf。

ace提供了更強大日誌設施:

1、可以在編譯時啟用或禁用巨集;

2、可以動態的啟用或禁用巨集;

3、支援日誌嚴重級別;

4、支援日誌重定向;

5、支援多執行緒安全和執行緒級配置;

使用ace的日誌相關功能,需要引入標頭檔案。

ace日誌輸出

ace提供了兩個巨集來支援日誌輸出:ace_debug、ace_error。

這兩個巨集的內部實現和行為都是一樣,只是為了在語義上區分除錯資訊和錯誤資訊。

在引入標頭檔案前新增以下定義可以關閉日誌輸出,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只接收單個字串,不支援格式化字串,輸出的日誌嚴重級別為lm_trace。

ace_trace預設是禁用的,網上經常有朋友反映看不到ace_trace的輸出,而很多回答也是錯的,單純在專案中定義#define ace_ntrace 0也是無法起作用的。

必須在ace/config.h標頭檔案中,在引用其他標頭檔案前定義並且重新編譯ace庫:

#define ace_ntrace 0

ACE服務端程式設計3 ACE跨平台之分配堆記憶體

ace服務端程式設計系列的第三篇,ace解決不同編譯器之間分配堆記憶體的差異。在ace的官方示例中會看到大量的ace new return,ace new這樣的巨集,這是ace為了消除不同編譯器編譯的 在堆上分配記憶體失敗的行為差異。具體來說 使用 malloc calloc 等分配記憶體的函式時,...

ACE服務端程式設計2 ACE跨平台之資料型別和寬字元

ace網路庫的主要優勢之一就是跨平台,ace提供了作業系統api和編譯器級別的跨平台解決方法,使開發人員不用再去關心作業系統和編譯器的差異,但因此也帶來了ace的複雜性。而不同的c 編譯器在以下方面也有明顯的差異 1 模版 2 資料型別和寬字元 3 執行時初始化和關閉 4 分配堆記憶體 以上主要參考...

基於ACE的網路服務端通訊程式設計

完成了基本的通訊功能 測試報告如下 昨天準備11臺 只有7臺機子可以執行 每個開了10個 大部分 都好的 有1台開10個的時候出錯 還有1臺早上看的時候10個都出錯 根據上面的圖顯示結果來看是由於服務端先關閉,客戶端傳送資料失敗導致。源 如下 class clientacceptor public ...