2019 % E7 % 8b % AC % E8 % a7 % 92 % E5 % 85 % BD % E4 % BC % 81 % E4 % b8 % e9 % 87 % 87 % 91 % E6 % 8b % 25 % b % E4 % b8 % 20 % 9b % e9 % 87 % 8d % E8 % a6 % 81 % E7 % 84 % E4 % ba % E4 % bb6 % E5 % 81 % a6 % 97 % a5 % E5 % BF % 995 % ba % 88 % 204 % ba % 8e % E7 % BC % ba % E5 % B0 % 91 % E5 % a5 % BD % E7 % 94 % A8调试程序% 20 % E4 % B9 % b8 % E6 % 25 % % 95 % E6 % 20 % 8c % E4 % BD % E7 % 94 % A8 % E6 % A0 % E5 % 87 % E5 % ba % 93 % E8 % 87 % aa % E5 % b8 % a6 % E7 % 94 % % 87 % ba % E7 % 25 % 20 % 88 % 91 % E4 % bb % AC % E5 % 8f % af % E4 % bb % a5 % E5 % ba % E4 % ba % 8e % 2033 358 www.Sina . 87f % E5 % 87 % E5 % B0 % 20 % ef % BC % 8c % E6 % 88 % 91 % E8 % a7 % E5 % be % 97 % E5 % ba % 94 % E8 % af % a5 % E6 % 98 % 4 % aa5 % a4 % ef % BC % 8c % 206 % 98 % 8e % E6 % 98be % E7 % 9a % 84 % E5 % BD % B1 % E5 % 93 % 8d % E6 % B6 % ef % BC % 8c anolog % E5 % 92 %8czerolollog % 20dc % 20 % 20 % E5 % ba % 93 nano log % 20 % E5 % 90 % af % E5 % 8f % 91 % ef % BC % 8c % 20 zzolog a4 % be5 % 8c % ba % e9 % 87 % 87c % ef % BC % 8c % E5 % AAA % 20 % BD % E6 % B1 % 82 % ef % BC % 8c % E5 % BC % 95 % E5 % 8f % 96 % E3 % 82 % 0a % 20 % e9 % a6 % 96 % E5 % 85 % ef % BC % 88c % ef % EC % 20bd % E7 % 94 % A8 % E6 % B3 % 95 % ef % bb %7bna nolog.set writer % 28os.stderr % 29h % 20 % 3d % 20 nano log.add logger % 28 % 27 example % 20 % 25i 357 % 208 % 29 % 20 string % 27 % 27c % 204 I % 29 % 20e6% 98 % af % E6 % af % 8f % E4 % b8 % aa % E7 % 8b % AC % E7 % 89 % B9 % E7 % 9a % 84打印E7 % E8 % E6 % B4 % E6 % b5 % 25 handle % ee6 % 25 % 202 f % 20 % E6 % 96 % B9 % E6 % B3 % 95 % E6 % 97 % B6 % ef % BC % 8c % E8 60 % 20 % E2 % 80 % c example % 27 % 20 % 27 % 20 % 20 % 20 % 20 % 20a % 84 % E7 % B1 % bb % E5 % 88 % ab : I 32 og line % 281 % 29 % 2c % 20 % E7 % 84 % B6 % E5 % 90 % E5 % B1 % E6 % af % E6 % 20ad % 97 % E7 % AC % a6 % E4 % b8 % B2 % % ad % 97 % E7 % AC % a6 % E4 % b8 % B2 % E7 % 87 % E6 % ae5 % B6 % E8 % ba % 20e6% 97 % B6 % ef % BC % 8c % E5 % BC % 80 % ee try % 282 % 29 % 2c % 20 % E6 % 8e5% E7 % 80 % E6 % 98 % a fhandle % 20 % E7 % 207 % E8 % 8a % 82 % E7 % 9a % 84 % E5 % 90 % ea

t{l}}// Level creates a child logger with the minimum accepted level set to level.func (l Logger) Level(lvl Level) Logger {return Logger{w: l.w,level: lvl,sample: l.sample,counter: l.counter,context: l.context,}}// Sample returns a logger that only let one message out of every to pass thru.func (l Logger) Sample(every int) Logger {if every == 0 {// Create a child with no sampling.return Logger{w: l.w,level: l.level,context: l.context,}}return Logger{w: l.w,level: l.level,sample: uint32(every),counter: new(uint32),context: l.context,}}

这几个构造器函数都是返回结构体实例,复制原有对象必要的字段,这样parent, child logger, 带有不同上下文的logger 之间互不干扰。

简单的benchmark 一下,nanolog,zerolog,std log:

package mainimport ("io/ioutil""log""testing""github.com/ScottMansfield/nanolog""github.com/rs/zerolog")func BenchmarkCompareToStdlib(b *testing.B) {b.Run("Nanolog", func(b *testing.B) {lw := nanolog.New()lw.SetWriter(ioutil.Discard)h := lw.AddLogger("foo thing bar thing %i64. Fubar %s foo. sadfasdf %u32 sdfasfasdfasdffds %u32.")args := []interface{}{int64(1), "string", uint32(2), uint32(3)}b.ResetTimer()for i := 0; i < b.N; i++ {lw.Log(h, args...)}})b.Run("Stdlib", func(b *testing.B) {args := []interface{}{int64(1), "string", uint32(2), uint32(3)}l := log.New(ioutil.Discard, "", 0)b.ResetTimer()for i := 0; i < b.N; i++ {l.Printf("foo thing bar thing %d. Fubar %s foo. sadfasdf %d sdfasfasdfasdffds %d.", args...)}})b.Run("Zerolog_printf", func(b *testing.B) {args := []interface{}{int64(1), "string", uint32(2), uint32(3)}logger := zerolog.New(ioutil.Discard)b.ResetTimer()for i := 0; i < b.N; i++ {logger.Log().Msgf("foo thing bar thing %d. Fubar %s foo. sadfasdf %d sdfasfasdfasdffds %d.", args...)}})b.Run("Zerolog_field", func(b *testing.B) {logger := zerolog.New(ioutil.Discard)b.ResetTimer()for i := 0; i < b.N; i++ {logger.Log().Int64("foo thing bar thing", 1).Str("Fubar foo", "string").Uint32("sadfasdf", 2).Uint32("sdfasfasdfasdffds", 3).Msg("")}})b.Run("Zerolog_context", func(b *testing.B) {logger := zerolog.New(ioutil.Discard).With().Int64("foo thing bar thing", 1).Str("Fubar foo", "string").Uint32("sadfasdf", 2).Uint32("sdfasfasdfasdffds", 3).Logger()b.ResetTimer()for i := 0; i < b.N; i++ {logger.Log().Msg("")}})} $ go test -bench Stdlib$ .BenchmarkCompareToStdlib/Nanolog-8 20000000 90.2 ns/opBenchmarkCompareToStdlib/Stdlib-8 5000000 364 ns/opBenchmarkCompareToStdlib/Zerolog_printf-8 5000000 404 ns/opBenchmarkCompareToStdlib/Zerolog_field-8 10000000 203 ns/opBenchmarkCompareToStdlib/Zerolog_context-8 20000000 60.5 ns/opPASSok examples/log10.053s

zerolog 在打印printf 风格时,比标准库还稍慢些,因为这里它是通过调用fmt.Sprintf实现。

转载于:https://my.oschina.net/evilunix/blog/1142754