opentracing-go原始碼閱讀——Log儲存(完結篇)
Log
該log設計參考了uber-go/zap, 日誌值型別非常多,該設計把日誌型別分為三類:string, int64和interface{}, 其中:
- string={string};
- int64={bool, int, int32, uint32, int64, uint64, float32, float64},
notice: 這裡沒有覆蓋int16和uint16
- interface{}={error, object, lazyLogger, noop}
根據Span interface中的LogFields和LogKVs方法, log.Field應該會包含{key, value}, 同時因為value值型別包含三類,所以Field的結構如下:
type Field struct {
key string
fieldType fieldType
numericVal int64
stringVal string
interfaceVal interface{}
}
Field提供了返回key,返回value和String三個方法操作,這已滿足需要;
注意,Span Tags和Span Logs不同的一點在於,Logs是可以累加的,並不是map結構,是列表儲存[]log.Fields
實現Span Logs的標準化結構如下:
func String(key, val string) Field {
return Field{
key: key,
fieldType: stringType,
stringVal: val,
}
}
// 其他型別都類似處理, 對於error和lazyLogger型別,不需要指定key
func Error(err error) Field{
return Field{
key: "error",
fieldType: errorType,
interfaceVal: err,
}
}
// LazyLogger 對廠商暴露出的自定義日誌實現
type LazyLogger func(fv Encoder)
func Lazy(ll LazyLogger) Field{
return Field{
fieldType: lazyLoggerType,
interfaceVal: ll,
}
}
// Noop用於忽略一些日誌處理;
// 例如:dev/test/prod的trace日誌等
func Noop() Field{
return Field{
fieldType: noopType,
}
}
我們可以對log.Field進行編碼操作,類似於json/xml Marshal操作;這個Encoder interface列出了log.Field中value值所有型別;所以,如果要對log.Field編碼操作,則需要實現所有值型別,共三大類。
對於Span interface中的LogFields和LogKVs兩個方法都是對[]log.Fields進行儲存,這兩個方法存在一個資料結構化轉換方法: InterleavedKVToFields, 把key-value鍵值對列表轉換成[]log.Field結構化日誌資料。
參考資料
相關文章
- opentracing-go原始碼閱讀一Go原始碼
- Appdash原始碼閱讀——Store儲存APP原始碼
- opentracing-go原始碼閱讀——資訊攜帶Go原始碼
- basictracer-go原始碼閱讀——examples(完結)Go原始碼
- TiFlash 原始碼閱讀(一) TiFlash 儲存層概覽原始碼
- 原始碼閱讀技巧篇原始碼
- 【原始碼閱讀】AndPermission原始碼閱讀原始碼
- ConcurrentHashMap 原始碼閱讀小結HashMap原始碼
- Flask 原始碼閱讀筆記 開篇Flask原始碼筆記
- OceanBase 原始碼解讀(九):儲存層程式碼解讀之「巨集塊儲存格式」原始碼
- Redis常用資料型別及其儲存結構(原始碼篇)Redis資料型別原始碼
- 【原始碼閱讀】Glide原始碼閱讀之with方法(一)原始碼IDE
- 【原始碼閱讀】Glide原始碼閱讀之into方法(三)原始碼IDE
- iOS開發原始碼閱讀篇--FMDB原始碼分析1(FMResultSet)iOS原始碼
- iOS開發原始碼閱讀篇--FMDB原始碼分析2(FMResultSet)iOS原始碼
- 【原始碼閱讀】Glide原始碼閱讀之load方法(二)原始碼IDE
- System.Collections.Generic 原始碼閱讀總結原始碼
- Nacos2.X原始碼閱讀總結原始碼
- TiFlash 原始碼閱讀(三)TiFlash DeltaTree 儲存引擎設計及實現分析 - Part 1原始碼儲存引擎
- ReactorKit原始碼閱讀React原始碼
- Vollery原始碼閱讀(—)原始碼
- NGINX原始碼閱讀Nginx原始碼
- ThreadLocal原始碼閱讀thread原始碼
- 原始碼閱讀-HashMap原始碼HashMap
- Runtime 原始碼閱讀原始碼
- RunLoop 原始碼閱讀OOP原始碼
- AmplifyImpostors原始碼閱讀原始碼
- stack原始碼閱讀原始碼
- CountDownLatch原始碼閱讀CountDownLatch原始碼
- fuzz原始碼閱讀原始碼
- HashMap 原始碼閱讀HashMap原始碼
- delta原始碼閱讀原始碼
- AQS原始碼閱讀AQS原始碼
- Mux 原始碼閱讀UX原始碼
- ConcurrentHashMap原始碼閱讀HashMap原始碼
- HashMap原始碼閱讀HashMap原始碼
- PostgreSQL 原始碼解讀(3)- 如何閱讀原始碼SQL原始碼
- iOS開發原始碼閱讀篇--FMDB原始碼分析3(FMDatabaseQueue+FMDatabasePool)iOS原始碼Database