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  }