希望對(duì)接口的邏輯流程做日志記錄,控制器請(qǐng)求 -> 數(shù)據(jù)庫(kù)操作 -> 控制器響應(yīng) 等一塊內(nèi)容記錄在一個(gè)文件中。
針對(duì)以上,該如何實(shí)現(xiàn),大家有沒(méi)有好的想法,謝教。
有想法,不過(guò)我自己沒(méi)試過(guò).給個(gè)思路你去實(shí)現(xiàn)看看.
建一個(gè)靜態(tài)類,在中間件開(kāi)始 生成一個(gè)uuid,存到靜態(tài)類里面去
在 bootstrap 里面
Db::listen(function(){
讀取靜態(tài)類uuid,有uuid就把sql寫(xiě)入靜態(tài)類里去
})
在中間件響應(yīng)那,讀取靜態(tài)類里面sql并且清掉uuid.
目前所實(shí)現(xiàn)的:
因?yàn)?數(shù)據(jù)庫(kù)監(jiān)聽(tīng)是針對(duì)所有數(shù)據(jù)庫(kù)操作, 和 控制的邏輯按順序處理響應(yīng) 是不同的,所以在并發(fā)情況下,記錄寫(xiě)入會(huì)存在問(wèn)題,所以在每個(gè)記錄處都顯式的記錄了uuid便于對(duì)應(yīng)。但顯然這個(gè)方案是無(wú)法使用的。
我再去研究下。
你所說(shuō)的的并發(fā)無(wú)效是錯(cuò)誤的,數(shù)據(jù)庫(kù)監(jiān)聽(tīng)是針對(duì)當(dāng)前進(jìn)程的數(shù)據(jù)庫(kù)操作,而不是所有的數(shù)據(jù)庫(kù)操作,所以,當(dāng)并發(fā)時(shí),當(dāng)前進(jìn)程監(jiān)聽(tīng)的只能是當(dāng)前進(jìn)程執(zhí)行的sql.然而webman是同步阻塞的,當(dāng)前進(jìn)程只能執(zhí)行一個(gè)請(qǐng)求,我并沒(méi)看到有哪里會(huì)導(dǎo)致無(wú)法使用.
寫(xiě)入問(wèn)題,如下圖:
寫(xiě)入不是順序的問(wèn)題不大啊,requestId不就是為了做過(guò)濾的么
cat abc.log | grep 'request-id'
就可以看到單次請(qǐng)求的全過(guò)程
我在自己項(xiàng)目本地加上去測(cè)過(guò)了,一秒內(nèi)十幾個(gè)請(qǐng)求,我沒(méi)看到有一個(gè)sql 串了請(qǐng)求的.
要復(fù)現(xiàn)也簡(jiǎn)單,開(kāi)2worker,一個(gè)worker內(nèi)處理一個(gè)長(zhǎng)耗時(shí)請(qǐng)求,一個(gè)worker處理多個(gè)短耗時(shí)請(qǐng)求,這樣你就能看到了