mirror of
https://github.com/nabbar/golib.git
synced 2026-04-22 23:17:12 +08:00
ca39d7ad26
- Refactor ErrorType, list errors managment, codeError - Add interface Error with error interface implement - Add type CodeError assign typiclly to const that represent code of error - Add func to registry func to retrieve message from an uint16 codeError (typicaly a switch of each codeError const) - Add default errorCode with default errorMessage if no one code or message is found - Add modeError to manage how to manage compatibility between Error interface and error interface - Add Error interface that allow parent link (parent as error or Error interface), code and trace management - Add trace finder to allow find func/file/line caller when Error is call - Add http 2 transport in httpcli - Add http 2 transport in httpserver - Add function to get client http with timeout management in httpcli - Add function to get Error if occurs of http client in httpcli - Add test for smtp package - Chg return error by returning Error in all packages - Chg package njs-archive by archive - Chg package njs-certif by certificates - Chg package njs-console by console - Chg package njs-crypt by crypt - Chg package njs-errors by errors - Chg package njs-httpcli by httpcli - Chg package njs-httpserver by httpserver - Chg package njs-ioutils by ioutils - Chg package njs-ldap by ldap - Chg package njs-logger by logger - Chg package njs-password by password - Chg package njs-progress by progress - Chg package njs-router by router - Chg package njs-semaphore by semaphore - Chg package njs-smtp by smtp - Chg package njs-static by static - Chg package njs-status by status - Chg package njs-version by version - Fix dependancies gopkg by github/go-ldap for go module compatibility - Fix gin Abort call by gin Abort with Error in static package - Fix issue #18 in status package : replace partner by component - Fix go vet error - Del deprecated function - Del useless function & files - Bump dependancies - Apply CHG in README.md
173 lines
4.6 KiB
Go
173 lines
4.6 KiB
Go
/*
|
|
MIT License
|
|
|
|
Copyright (c) 2019 Nicolas JUHEL
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
*/
|
|
|
|
package logger
|
|
|
|
import (
|
|
"log"
|
|
"path"
|
|
"reflect"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"bytes"
|
|
"strconv"
|
|
)
|
|
|
|
const (
|
|
tagStack = "stack"
|
|
tagTime = "time"
|
|
//tagLevel = "level" //unused
|
|
tagCaller = "func"
|
|
tagFile = "file"
|
|
tagLine = "line"
|
|
tagMsg = "message"
|
|
tagErr = "error"
|
|
tagData = "data"
|
|
)
|
|
|
|
var (
|
|
currPkgs = path.Base(reflect.TypeOf(IOWriter{}).PkgPath())
|
|
modeColor = true
|
|
timestamp = true
|
|
filetrace = false
|
|
enableGID = false
|
|
enableVPR = true
|
|
)
|
|
|
|
// GetLogger return a golang log.logger instance linked with this main logger
|
|
//
|
|
// This function is useful to keep the format, mode, color, output... same as current config
|
|
/*
|
|
msgPrefixPattern a pattern prefix to identify or comment all message passed throw this log.logger instance
|
|
msgPrefixArgs a list of interface to apply on pattern with a fmt function
|
|
*/
|
|
func GetLogger(lvl Level, logFlags int, msgPrefixPattern string, msgPrefixArgs ...interface{}) *log.Logger {
|
|
return log.New(GetIOWriter(lvl, msgPrefixPattern, msgPrefixArgs...), "", logFlags)
|
|
}
|
|
|
|
// GetLogger force the default golang log.logger instance linked with this main logger
|
|
//
|
|
// This function is useful to keep the format, mode, color, output... same as current config
|
|
/*
|
|
msgPrefixPattern a pattern prefix to identify or comment all message passed throw this log.logger instance
|
|
msgPrefixArgs a list of interface to apply on pattern with a fmt function
|
|
*/
|
|
func SetStdLogger(lvl Level, logFlags int, msgPrefixPattern string, msgPrefixArgs ...interface{}) {
|
|
log.SetOutput(GetIOWriter(lvl, msgPrefixPattern, msgPrefixArgs...))
|
|
log.SetPrefix("")
|
|
log.SetFlags(logFlags)
|
|
}
|
|
|
|
// AddGID Reconfigure the current logger to add or not the thread GID before each message.
|
|
func AddGID(enable bool) {
|
|
enableGID = enable
|
|
}
|
|
|
|
// Timestamp Reconfigure the current logger to add or not the timestamp before each message.
|
|
func Timestamp(enable bool) {
|
|
timestamp = enable
|
|
}
|
|
|
|
// FileTrace Reconfigure the current logger to add or not the origin file/line of each message.
|
|
//
|
|
// This option is apply for all message except info message
|
|
func FileTrace(enable bool) {
|
|
filetrace = enable
|
|
setViperLogTrace()
|
|
}
|
|
|
|
// EnableColor Reconfigure the current logger to use color in messages format.
|
|
//
|
|
// This apply only for next message and only for TextFormat
|
|
func EnableColor() {
|
|
modeColor = true
|
|
updateFormatter(nilFormat)
|
|
}
|
|
|
|
// DisableColor Reconfigure the current logger to not use color in messages format.
|
|
//
|
|
// This apply only for next message and only for TextFormat
|
|
func DisableColor() {
|
|
modeColor = false
|
|
updateFormatter(nilFormat)
|
|
}
|
|
|
|
// EnableViperLog or not the Gin Logger configuration
|
|
func EnableViperLog(enable bool) {
|
|
enableVPR = enable
|
|
setViperLogTrace()
|
|
}
|
|
|
|
func getFrame() runtime.Frame {
|
|
// Set size to targetFrameIndex+2 to ensure we have room for one more caller than we need
|
|
programCounters := make([]uintptr, 0)
|
|
n := runtime.Callers(0, programCounters)
|
|
|
|
if n > 0 {
|
|
frames := runtime.CallersFrames(programCounters[:n])
|
|
more := true
|
|
|
|
for more {
|
|
var (
|
|
frame runtime.Frame
|
|
)
|
|
|
|
frame, more = frames.Next()
|
|
|
|
if strings.Contains(frame.Function, currPkgs) {
|
|
continue
|
|
}
|
|
|
|
return frame
|
|
}
|
|
}
|
|
|
|
return runtime.Frame{Function: "unknown", File: "unknown", Line: 0}
|
|
}
|
|
|
|
func getGID() uint64 {
|
|
b := make([]byte, 64)
|
|
|
|
b = b[:runtime.Stack(b, false)]
|
|
b = bytes.TrimPrefix(b, []byte("goroutine "))
|
|
b = b[:bytes.IndexByte(b, ' ')]
|
|
|
|
n, _ := strconv.ParseUint(string(b), 10, 64) // #nosec
|
|
|
|
return n
|
|
}
|
|
|
|
func ginTonicAddError(c *gin.Context, err error) {
|
|
if c != nil && err != nil {
|
|
_ = c.Error(err)
|
|
}
|
|
}
|
|
|
|
func proceed(lvl Level) bool {
|
|
return lvl != NilLevel && lvl <= curLevel
|
|
}
|