go.temporal.io/server@v1.23.0/common/log/sdk_logger.go (about) 1 // The MIT License 2 // 3 // Copyright (c) 2020 Temporal Technologies Inc. All rights reserved. 4 // 5 // Copyright (c) 2020 Uber Technologies, Inc. 6 // 7 // Permission is hereby granted, free of charge, to any person obtaining a copy 8 // of this software and associated documentation files (the "Software"), to deal 9 // in the Software without restriction, including without limitation the rights 10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 // copies of the Software, and to permit persons to whom the Software is 12 // furnished to do so, subject to the following conditions: 13 // 14 // The above copyright notice and this permission notice shall be included in 15 // all copies or substantial portions of the Software. 16 // 17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 // THE SOFTWARE. 24 25 package log 26 27 import ( 28 "fmt" 29 30 "go.temporal.io/sdk/log" 31 32 "go.temporal.io/server/common/log/tag" 33 ) 34 35 const ( 36 extraSkipForSdkLogger = 1 37 noValue = "no value" 38 ) 39 40 type SdkLogger struct { 41 logger Logger 42 } 43 44 var _ log.Logger = (*SdkLogger)(nil) 45 46 func NewSdkLogger(logger Logger) *SdkLogger { 47 if sl, ok := logger.(SkipLogger); ok { 48 logger = sl.Skip(extraSkipForSdkLogger) 49 } 50 51 return &SdkLogger{ 52 logger: logger, 53 } 54 } 55 56 func (l *SdkLogger) tags(keyvals []interface{}) []tag.Tag { 57 var tags []tag.Tag 58 for i := 0; i < len(keyvals); i++ { 59 if t, keyvalIsTag := keyvals[i].(tag.Tag); keyvalIsTag { 60 tags = append(tags, t) 61 continue 62 } 63 64 key, keyIsString := keyvals[i].(string) 65 if !keyIsString { 66 key = fmt.Sprintf("%v", keyvals[i]) 67 } 68 var val interface{} 69 if i+1 == len(keyvals) { 70 val = noValue 71 } else { 72 val = keyvals[i+1] 73 i++ 74 } 75 76 tags = append(tags, tag.NewAnyTag(key, val)) 77 } 78 79 return tags 80 } 81 82 func (l *SdkLogger) Debug(msg string, keyvals ...interface{}) { 83 l.logger.Debug(msg, l.tags(keyvals)...) 84 } 85 86 func (l *SdkLogger) Info(msg string, keyvals ...interface{}) { 87 l.logger.Info(msg, l.tags(keyvals)...) 88 } 89 90 func (l *SdkLogger) Warn(msg string, keyvals ...interface{}) { 91 l.logger.Warn(msg, l.tags(keyvals)...) 92 } 93 94 func (l *SdkLogger) Error(msg string, keyvals ...interface{}) { 95 l.logger.Error(msg, l.tags(keyvals)...) 96 } 97 98 func (l *SdkLogger) With(keyvals ...interface{}) log.Logger { 99 return NewSdkLogger( 100 With(l.logger, l.tags(keyvals)...)) 101 }