github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/vdebug.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 package libkb 5 6 import ( 7 "fmt" 8 "strings" 9 "sync" 10 11 "github.com/keybase/client/go/logger" 12 "golang.org/x/net/context" 13 ) 14 15 // VDebugLog is a "Verbose" debug logger; enable it if you really 16 // want spam and/or minutiae 17 type VDebugLog struct { 18 log logger.Logger 19 dumpSiteLoadUser bool 20 dumpPayload bool 21 22 lock sync.RWMutex 23 lev VDebugLevel 24 } 25 26 type VDebugLevel int 27 28 func NewVDebugLog(l logger.Logger) *VDebugLog { 29 return &VDebugLog{log: l} 30 } 31 32 const ( 33 VLogNone VDebugLevel = iota - 1 34 VLog0 35 VLog1 36 VLog2 37 VLog3 38 39 VLogNoneString = "mobile" 40 VLog0String = "vlog0" 41 VLog1String = "vlog1" 42 VLog2String = "vlog2" 43 VLog3String = "vlog3" 44 VLogDumpSiteLoadUser = "dump-site-load-user" 45 VLogDumpPayload = "dump-payload" 46 ) 47 48 func (v VDebugLevel) String() string { 49 switch v { 50 case VLogNone: 51 return VLogNoneString 52 case VLog0: 53 return VLog0String 54 case VLog1: 55 return VLog1String 56 case VLog2: 57 return VLog2String 58 case VLog3: 59 return VLog3String 60 default: 61 return "unknown" 62 } 63 } 64 65 func (v *VDebugLog) getLev() VDebugLevel { 66 v.lock.RLock() 67 defer v.lock.RUnlock() 68 return v.lev 69 } 70 71 func (v *VDebugLog) Log(lev VDebugLevel, fs string, args ...interface{}) { 72 if lev <= v.getLev() { 73 prfx := fmt.Sprintf("{VDL:%d} ", int(lev)) 74 fs = prfx + fs 75 v.log.CloneWithAddedDepth(1).Debug(fs, args...) 76 } 77 } 78 79 func (v *VDebugLog) CLogf(ctx context.Context, lev VDebugLevel, fs string, args ...interface{}) { 80 if lev <= v.getLev() { 81 prfx := fmt.Sprintf("{VDL:%d} ", int(lev)) 82 fs = prfx + fs 83 v.log.CloneWithAddedDepth(1).CDebugf(ctx, fs, args...) 84 } 85 } 86 87 func (v *VDebugLog) CLogfWithAddedDepth(ctx context.Context, lev VDebugLevel, d int, fs string, args ...interface{}) { 88 if lev <= v.getLev() { 89 prfx := fmt.Sprintf("{VDL:%d} ", int(lev)) 90 fs = prfx + fs 91 v.log.CloneWithAddedDepth(1+d).CDebugf(ctx, fs, args...) 92 } 93 } 94 95 func (v *VDebugLog) DumpSiteLoadUser() bool { 96 return v.dumpSiteLoadUser 97 } 98 99 func (v *VDebugLog) DumpPayload() bool { 100 return v.dumpPayload 101 } 102 103 func (v *VDebugLog) Configure(s string) { 104 v.lock.Lock() 105 defer v.lock.Unlock() 106 107 v.lev = VLog0 108 if len(s) == 0 { 109 return 110 } 111 v.log.Debug("Setting Vdebug to %q", s) 112 parts := strings.Split(s, ",") 113 for _, s := range parts { 114 switch s { 115 case VLogNoneString: 116 v.lev = VLogNone 117 case VLog0String: 118 v.lev = VLog0 119 case VLog1String: 120 v.lev = VLog1 121 case VLog2String: 122 v.lev = VLog2 123 case VLog3String: 124 v.lev = VLog3 125 case VLogDumpSiteLoadUser: 126 v.dumpSiteLoadUser = true 127 case VLogDumpPayload: 128 v.dumpPayload = true 129 default: 130 v.log.Warning("Ignoring Vdebug log directive: %q", s) 131 } 132 } 133 }