概览

Core 通过 With 方法,生成 CheckedEntry,CheckedEntry 记录自己归属的 Core 实例。写入日志时,真正执行的还是记录的 Core 实例的 Write(Entry, []Field) 方法。
实现
生成方式
使用 sync.Pool 有效减少对象分配次数
var (_cePool = sync.Pool{New: func() interface{} {// Pre-allocate some space for cores.return &CheckedEntry{cores: make([]Core, 4),}}})
获取方法
func getCheckedEntry() *CheckedEntry {ce := _cePool.Get().(*CheckedEntry)ce.reset()return ce}
日志记录
记录需要打印本条 Entry 的 Core 实例
func (ce *CheckedEntry) AddCore(ent Entry, core Core) *CheckedEntry {if ce == nil {ce = getCheckedEntry()ce.Entry = ent}ce.cores = append(ce.cores, core)return ce}
记录日志
func (ce *CheckedEntry) Write(fields ...Field) {if ce == nil {return}if ce.dirty {if ce.ErrorOutput != nil {// 检查重复使用 CheckedEntry 的情况fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", time.Now(), ce.Entry)ce.ErrorOutput.Sync()}return}ce.dirty = truevar err errorfor i := range ce.cores { // 记录日志err = multierr.Append(err, ce.cores[i].Write(ce.Entry, fields))}if ce.ErrorOutput != nil { // 记录日志错误if err != nil {fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", time.Now(), err)ce.ErrorOutput.Sync()}}should, msg := ce.should, ce.MessageputCheckedEntry(ce) // 将 CheckedEntry 放回 Poolswitch should {case WriteThenPanic:panic(msg)case WriteThenFatal:exit.Exit()}}
