當前位置:編程學習大全網 - 源碼下載 - 如何修改golang記錄器輸出格式

如何修改golang記錄器輸出格式

1.記錄器結構

首先看壹下類型記錄器的定義:

類型記錄器結構{

mu同步。互斥//確保原子寫;保護以下字段

前綴字符串//要寫在每行開頭的前綴

標誌int // properties

輸出io。Writer //輸出的目標

buf []byte //用於累積要寫入的文本

}

主要有五個成員,其中三個是我們熟悉的,分別是“prefix”表示日誌的前綴,“flag”表示日誌的頭標簽,以及輸出目的地out of Log。Buf是壹個字節數組,主要用來存儲要刷入刷出的內容,相當於壹個臨時緩存,在序列化輸出內容時作為存儲目的地。Mu是壹個互斥體,主要用於線程安全實踐。當有多個goroutine同時將內容刷到壹個目的地時,互斥保證每個寫的都是壹條完整的信息。

2 .標準和整體結構

在上壹篇文章中,我們提到日誌模塊提供了壹個簡單的包級接口,可以直接將日誌內容打印到標準錯誤。那麽這個過程是如何實現的呢?其實是通過內置的Logger類型變量“std”來實現的。該變量使用:

var std = New(os。Stderr,"",LstdFlags)

初始化,默認輸出到系統的標準輸出" os。Stderr”,前綴為空,日期加時間用作日誌頭。

當我們調用log時如何執行?打印?讓我們看看它的代碼:

功能打印(v...接口{}) {

std。輸出(2,fmt。沖刺(v...))

}

這裏實際調用了Logger對象的Output方法,按照fmt包中約定的格式對日誌內容進行轉義,並傳遞給輸出。輸出定義如下:

func (l *Logger)輸出(調用深度int,s string)錯誤

其中s是不帶前綴和日誌頭的日誌的具體內容,xxxxx。該函數執行將日誌刷到相應位置的特定任務。

3.核心功能的實現

伐木工。輸出是將日誌刷到相應位置的特定方法。

該方法首先根據需要獲取當前時間以及調用該方法的文件和行號信息。然後調用formatHeader方法對日誌的前綴和頭進行格式化並放入Logger.buf中,然後將日誌的內容存儲在Logger.buf中,最後調用Logger.out.Write方法將完整的日誌寫入輸出目的地。

因為寫文件和拼接buf的過程是線程不安全的,所以使用互斥體來保證每次寫入的原子性。

微升鎖定()

延遲l.mu.Unlock()

把buf的拼接和文件的編寫放在這之後,這樣在多個goroutine中使用同壹個Logger對象,就不會混淆buf,混淆編寫。

該方法的第壹個參數最終將被傳遞給運行時的skip。調用者,它指的是跳過的堆棧的深度。這裏我記得給2。這將得到我們調用日誌的位置。

在golang的評論裏,說的是鎖定runtime的過程。調用者很重,這個我還是不明白,但是我從代碼裏看到它打開了這裏的鎖。

如果國旗& amp(Lshortfile|Llongfile)!= 0 {

//在獲取調用方信息時釋放鎖-代價很高。

l.mu.Unlock()

var ok bool

_,文件,行,ok =運行時。呼叫者(呼叫深度)

如果!好的

文件= "?"

線= 0

}

微升鎖定()

}

在formatHeader中,首先將前綴直接復制到Logger.buf,然後根據標誌選擇日誌頭的內容。這裏使用的是log模塊實現的itoa的方法,類似於C的itoa,把整數轉換成字符串。只是在轉換之後,結果直接追加到buf的尾部。

縱觀整個實現,最值得學習的是線程安全部分。什麽樣的同步操作在什麽位置合適?

4.外部接口的實現

了解了核心的格式化和輸出結構之後,再看它的封裝就很簡單了。幾乎都是先用output記錄日誌,必要時再做os.exit或者panic操作。這裏,我們來看看Fatal的實現。

func (l *Logger)致命(v...接口{}) {

長度輸出(2,fmt。沖刺(v...))

os。出口(1)

}

// Fatalf相當於l.Printf()後跟對os的調用。出口(1)。

func (l *Logger) Fatalf(格式字符串,v...接口{}) {

長度輸出(2,fmt。Sprintf(格式,v...))

os。出口(1)

}

// Fatalln相當於l.Println()後跟對os的調用。出口(1)。

func (l *Logger) Fatalln(v...接口{}) {

長度輸出(2,fmt。斯普林特公司...))

os。出口(1)

}

這裏我們也驗證了之前做的Panic的結果,先做了輸出日誌操作。然後潘。

  • 上一篇:急求JAVA源代碼,小遊戲或者別的
  • 下一篇:網絡指數公式源代碼
  • copyright 2024編程學習大全網