或許大家會疑問,已經有了強大的log4net,nlog等,為啥還要自己折騰寫日誌呢,那是因為最近我有個需求,把所有的操作記錄到日誌檔案裡,然後運維每天自動把這些日誌同步到kibana做日誌收集,然後分析處理。
其實一開始我是想直接讓他們做乙個介面,然後我每次的操作都呼叫一次他們的介面,這樣也可以同步日誌,但老大認為這種高頻低價值並且無需實時的資料沒必要動用介面,這樣其實是一種浪費,先寫日誌,然後統一處理更高效。我想了一下,貌似確實是沒必要動用介面。
那麼自己寫日誌咋寫呢,一開始我是直接簡單粗暴每來一條日誌,就寫一次檔案:
//////記錄推送日誌
/// ///
訊息id
///推送狀態
///品牌 public
static
void addpushlog(string messageid, pushstatus status, string
brand)
var now =datetime.now;
var filename = $"
/pushlog/.csv";
",,,\n");
}
但是沒過幾天,我發現日誌有點問題,會出現日誌黏連現象,就是兩條日誌黏在一起了,之所以這樣,是因為寫入太頻繁了,導致兩個寫入同時發生了,所以他們的寫入就可能黏在一起。
那麼該如何避免這種並行事件呢,而且每來一條日誌就寫一次日誌確實效能也不佳。
我想了一下,那就1分鐘寫入一次吧,寫入先放在生產者列表,然後搞個後台任務,每分鐘去檢視一下生產者列表,發現有日誌,則把生產者交給消費者,然後生產者清空後繼續生產,消費者就把這批次的日誌批量寫入日誌檔案,**如下:
//日誌生產者
private
static list _logsproducer = new list();
//日誌消費者
private
static list_logsconsumer;
//日誌臨時存放,用來交換生產者和消費者
private
static list _logstemp = new list();
//////
記錄推送日誌
/// ///
訊息id
///推送狀態
///品牌 public
static
void addpushlog(string messageid, pushstatus status, string
brand)
,,,");}}
//////
清空push日誌,寫入到push日誌檔案
/// public
static
void
flushpushlog()
_logsconsumer =_logsproducer;
_logsproducer =_logstemp;
var now =datetime.now;
var filename = $"
/pushlog/.csv";
_logsconsumer.clear();
_logstemp =_logsconsumer;
}
**很簡潔,發現有日誌時,
_logsconsumer =_logsproducer,這時候生產者和消費者指向了同乙個列表,這時候
_logsproducer繼續增加日誌的話,
_logsconsumer也會增加,因為他們指向了同一片記憶體,然後
_logsproducer =_logstemp,因為
_logstemp是空的,所以生產者相當於被清空了,這樣就完成了生產者和消費者交換資料的操作,然後消費者得到了生產者的資料後,就把日誌通過
_logstemp =_logsconsumer就把消費者列表交還給臨時列表了,這樣操作就結束了。大家可以發現全程無鎖,全程只用到了兩個list,另乙個list只是中轉用的,並沒有new出來的。那麼接下來只需要搞乙個後台任務去定時清空寫入日誌即可,**如下:
//////每分鐘寫一次push日誌
/// public
class
pushlogservice : backgroundservice
protected
override
async
task executeasync(cancellationtoken stoppingtoken)
catch
(exception e)
finally}}
}
publicvoid
private
void
onshutdown()
這樣就可以在**關閉前清空日誌了。
php建立簡單的文字日誌方法
建立文字日誌,傳送訂單資訊 public function sendlogs val,col url content start.content.end fwrite fp,content fclose fp 建立文字日誌,接收shop傳送的訂單資訊 public function receivel...
終端輸出有顏色的文字日誌
設定顏色的格式為 以 033 f bm 以 033 0m結束 f b 顏色 30 40 黑色 31 41 紅色 32 42 綠色 33 43 黃色 34 44 藍色 35 45 紫紅色 36 46 青藍色 37 47 白色 那麼在列印日誌的時候很好看 例如 為 033 1 35 48mtotal 3...
Spring的AOP極簡入門
aop是spring中的面向切面的程式設計,這裡簡單感受一下如何在xml檔案中配置乙個切面。如上圖所示,配置乙個切面的主要思路有以下幾個步驟。1,首先需要把實現切面功能的類宣告為乙個bean,例如圖中的minstrel。2,前面的配置都在標籤下進行。乙個切面對應乙個標籤,標籤的ref可以指定實現該切...