github.com/aldelo/common@v1.5.1/wrapper/zap/zaplog.go (about) 1 package data 2 3 /* 4 * Copyright 2020-2023 Aldelo, LP 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 import ( 20 "errors" 21 util "github.com/aldelo/common" 22 "go.uber.org/zap" 23 "strings" 24 ) 25 26 // ZapLog is a wrapper for Zap logger package 27 // 28 // DisableLogger = disables the logger from operations, this allows code to be left in place while not performing logging action 29 // OutputToConsole = redirects log output to console instead of file 30 // AppName = required, this app's name 31 type ZapLog struct { 32 // operating var 33 DisableLogger bool 34 35 OutputToConsole bool 36 AppName string 37 38 // store zap client object 39 zapLogger *zap.Logger 40 sugarLogger *zap.SugaredLogger 41 } 42 43 // Init will initialize and prepare the zap log wrapper for use, 44 // 45 // ...-internal-err.log = internal zap errors logged, this file may be created but may contain no data as there may not be any internal zap errors 46 // log output to file is 'appname.log' 47 func (z *ZapLog) Init() error { 48 // validate 49 if util.LenTrim(z.AppName) <= 0 { 50 return errors.New("Init Logger Failed: " + "App Name is Required") 51 } 52 53 // clean up 54 if z.sugarLogger != nil { 55 z.sugarLogger = nil 56 } 57 58 if z.zapLogger != nil { 59 z.zapLogger = nil 60 } 61 62 // init zap logger 63 var err error 64 65 if !z.OutputToConsole { 66 // log to file 67 prod := zap.NewProductionConfig() 68 69 prod.Development = true 70 prod.DisableCaller = true 71 72 prod.Encoding = "json" 73 74 prod.OutputPaths = []string{z.AppName + ".log"} 75 prod.ErrorOutputPaths = []string{z.AppName + "-internal-err.log"} 76 77 z.zapLogger, err = prod.Build() 78 } else { 79 // log to console 80 z.zapLogger, err = zap.NewProduction() 81 } 82 83 if err != nil { 84 return errors.New("Init Logger Failed: " + err.Error()) 85 } 86 87 // init zap sugared logger 88 z.sugarLogger = z.zapLogger.Sugar() 89 90 // init success 91 return nil 92 } 93 94 // Sync will flush log buffer to disk 95 func (z *ZapLog) Sync() { 96 if !z.DisableLogger { 97 //if z.sugarLogger != nil { 98 // _ = z.sugarLogger.Sync() 99 //} 100 101 if z.zapLogger != nil { 102 _ = z.zapLogger.Sync() 103 } 104 } 105 } 106 107 // Printf is alias method to Infof 108 func (z *ZapLog) Printf(format string, items ...interface{}) { 109 z.Infof(format, items...) 110 } 111 112 // Infof is a Sugared Logging, allows template variable such as %s 113 func (z *ZapLog) Infof(logTemplateData string, args ...interface{}) { 114 if z.sugarLogger != nil && !z.DisableLogger { 115 z.sugarLogger.Infof(logTemplateData, args...) 116 } 117 } 118 119 // Infow is a Sugared Logging, allows key value pairs variadic 120 func (z *ZapLog) Infow(logMessageData string, keyValuePairs ...interface{}) { 121 if z.sugarLogger != nil && !z.DisableLogger { 122 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 123 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 124 z.sugarLogger.Infow(logMessageData, keyValuePairs...) 125 } 126 } 127 128 // Info is faster Logging, but requires import of zap package, uses zap.String(), zap.Int(), etc in fields parameters 129 func (z *ZapLog) Info(logMessageData string, fields ...zap.Field) { 130 if z.zapLogger != nil && !z.DisableLogger { 131 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 132 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 133 z.zapLogger.Info(logMessageData, fields...) 134 } 135 } 136 137 // Debugf is a Sugared Logging, allows template variable such as %s 138 func (z *ZapLog) Debugf(logTemplateData string, args ...interface{}) { 139 if z.sugarLogger != nil && !z.DisableLogger { 140 z.sugarLogger.Debugf(logTemplateData, args...) 141 } 142 } 143 144 // Debugw is a Sugared Logging, allows key value pairs variadic 145 func (z *ZapLog) Debugw(logMessageData string, keyValuePairs ...interface{}) { 146 if z.sugarLogger != nil && !z.DisableLogger { 147 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 148 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 149 z.sugarLogger.Debugw(logMessageData, keyValuePairs...) 150 } 151 } 152 153 // Debug is faster logging, but requires import of zap package, uses zap.String(), zap.Int(), etc in fields parameters 154 func (z *ZapLog) Debug(logMessageData string, fields ...zap.Field) { 155 if z.zapLogger != nil && !z.DisableLogger { 156 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 157 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 158 z.zapLogger.Debug(logMessageData, fields...) 159 } 160 } 161 162 // Warnf is a Sugared Logging, allows template variable such as %s 163 func (z *ZapLog) Warnf(logTemplateData string, args ...interface{}) { 164 if z.sugarLogger != nil && !z.DisableLogger { 165 z.sugarLogger.Warnf(logTemplateData, args...) 166 } 167 } 168 169 // Warnw is a Sugared Logging, allows key value pairs variadic 170 func (z *ZapLog) Warnw(logMessageData string, keyValuePairs ...interface{}) { 171 if z.sugarLogger != nil && !z.DisableLogger { 172 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 173 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 174 z.sugarLogger.Warnw(logMessageData, keyValuePairs...) 175 } 176 } 177 178 // Warn is faster logging, but requires import of zap package, uses zap.String(), zap.Int(), etc in fields parameters 179 func (z *ZapLog) Warn(logMessageData string, fields ...zap.Field) { 180 if z.zapLogger != nil && !z.DisableLogger { 181 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 182 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 183 z.zapLogger.Warn(logMessageData, fields...) 184 } 185 } 186 187 // Errorf is a Sugared Logging, allows template variable such as %s 188 func (z *ZapLog) Errorf(logTemplateData string, args ...interface{}) { 189 if z.sugarLogger != nil && !z.DisableLogger { 190 z.sugarLogger.Errorf(logTemplateData, args...) 191 } 192 } 193 194 // Errorw is a Sugared Logging, allows key value pairs variadic 195 func (z *ZapLog) Errorw(logMessageData string, keyValuePairs ...interface{}) { 196 if z.sugarLogger != nil && !z.DisableLogger { 197 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 198 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 199 z.sugarLogger.Errorw(logMessageData, keyValuePairs...) 200 } 201 } 202 203 // Error is faster logging, but requires import of zap package, uses zap.String(), zap.Int(), etc in fields parameters 204 func (z *ZapLog) Error(logMessageData string, fields ...zap.Field) { 205 if z.zapLogger != nil && !z.DisableLogger { 206 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 207 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 208 z.zapLogger.Error(logMessageData, fields...) 209 } 210 } 211 212 // Panicf is a Sugared Logging, allows template variable such as %s 213 func (z *ZapLog) Panicf(logTemplateData string, args ...interface{}) { 214 if z.sugarLogger != nil && !z.DisableLogger { 215 z.sugarLogger.Panicf(logTemplateData, args...) 216 } 217 } 218 219 // Panicw is a Sugared Logging, allows key value pairs variadic 220 func (z *ZapLog) Panicw(logMessageData string, keyValuePairs ...interface{}) { 221 if z.sugarLogger != nil && !z.DisableLogger { 222 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 223 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 224 z.sugarLogger.Panicw(logMessageData, keyValuePairs...) 225 } 226 } 227 228 // Panic is faster logging, but requires import of zap package, uses zap.String(), zap.Int(), etc in fields parameters 229 func (z *ZapLog) Panic(logMessageData string, fields ...zap.Field) { 230 if z.zapLogger != nil && !z.DisableLogger { 231 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 232 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 233 z.zapLogger.Panic(logMessageData, fields...) 234 } 235 } 236 237 // Fatalf is a Sugared Logging, allows template variable such as %s 238 func (z *ZapLog) Fatalf(logTemplateData string, args ...interface{}) { 239 if z.sugarLogger != nil && !z.DisableLogger { 240 z.sugarLogger.Fatalf(logTemplateData, args...) 241 } 242 } 243 244 // Fatalw is a Sugared Logging, allows key value pairs variadic 245 func (z *ZapLog) Fatalw(logMessageData string, keyValuePairs ...interface{}) { 246 if z.sugarLogger != nil && !z.DisableLogger { 247 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 248 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 249 z.sugarLogger.Fatalw(logMessageData, keyValuePairs...) 250 } 251 } 252 253 // Fatal is faster logging, but requires import of zap package, uses zap.String(), zap.Int(), etc in fields parameters 254 func (z *ZapLog) Fatal(logMessageData string, fields ...zap.Field) { 255 if z.zapLogger != nil && !z.DisableLogger { 256 logMessageData = strings.ReplaceAll(logMessageData, "\n", "") 257 logMessageData = strings.ReplaceAll(logMessageData, "\r", "") 258 z.zapLogger.Fatal(logMessageData, fields...) 259 } 260 }