本文編寫主要目的是記錄工作中的一些程式設計思想和細節,以便後來查閱。
由於專案中設計高併發內容,涉及到乙個執行緒建立多個子執行緒的情況。 那麼,如何跟蹤日誌,識別子執行緒是由哪個主線程建立的,屬於哪個request請求。
例如, 在現有專案中,乙個裝置資訊上傳的請求(包括基本資料和異常資料兩種資料),然後主線程建立兩個子執行緒,來處理基本資料和異常資料。
簡化**如下:
public static void main(string args) ;
//建立子執行緒1,處理異常資料
mthread mthread1 = new mthread(new runnable()
});建立子執行緒2,處理普通資料
mthread mthread2 = new mthread(new runnable()
});new thread(mthread1).start();
new thread(mthread2).start();
}});
t.start();
}}class mthread implements runnable
@override
public void run() }
執行結果如下:
乙個請求有三個執行緒,如果有多個請求,執行結果如下:
從日誌中無法看出他們之間的所屬關係(判斷不出來他們是否是處理同乙個request請求的)。如果某乙個執行緒出現問題,我們也很難快速定位是哪個請求的處理結果。
因此,我們使用mdc來在日誌中增加traceid(同乙個請求的多個執行緒擁有同乙個traceid)。
思路如下:
1. 在request進來的時候, 利用aop為每個request建立乙個traceid(保證每個request的traceid不同, 同乙個request的traceid相同)
2. 建立子執行緒的時候, 將traceid通過動態**的方式,傳遞到子執行緒中
public static void main(string args) ;
mthread mthread1 = new mthread(new runnable()
}, mdc.getcopyofcontextmap());
mthread mthread2 = new mthread(new runnable()
}, mdc.getcopyofcontextmap());
new thread(mthread1).start();
new thread(mthread2).start();}};
new thread(runnable).start();
new thread(runnable).start();
}}class mthread implements runnable
@override
public void run()
}//日誌**
class logproxy implements invocationhandler
@override
public object invoke(object proxy, method method, object args) throws throwable
return method.invoke(r, args);
}} 執行結果如下:
兩個請求, 同乙個請求的traceid相同,不同請求的traceid不同。 完美實現多執行緒的日誌追蹤。
實際web專案中,只需要在logback日誌配置檔案中,
logging.pattern.console引數增[%x]即可在logger日誌中列印traceid的資訊。
python log日誌 多執行緒安全
python中的日誌檔案為logger,常用的有兩個 rotatingfilehandler timedrotatingfilehandler。檔案沒滿足分割條件前,儲存在 info.log 自己命名的檔案 中,如果滿足分割條件,會生成 info.log.1 下一次滿足分割條件後,將 info.lo...
QT匯出日誌多執行緒
以下demo實現的功能 include include class logoutput public qthread 繼承qthread類,使log輸出另起執行緒,不干擾主線程 定義匯出log的類 void logoutput run void custommessagehandler qtmsgt...
多執行緒與日誌的學習
def download while true glock.acquire if len face url list 0 glock.release continue else face url face url list.pop glock.release html requests.get fa...