做個極簡的文字日誌收集

2022-01-21 20:25:54 字數 2522 閱讀 1974

或許大家會疑問,已經有了強大的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}}

}

public

void

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可以指定實現該切...