1. 概述
记录日志,是软件开发过程中最常用的功能之一,不仅可以帮助使用者
了解软件的运行情况,也可以帮助开发者
很快地发现和定位问题。
因此,对于日志的记录,也有一些基本要求,例如:
- 时间,包含日期,最好精确到毫秒或微秒
- 日志等级,由低到高,分几个等级:debug、info、warning、error、fatal等
- 记录日志的代码行号,在不影响性能的情况下,能显示最好
- 日志内容,支持更自由的内容记录方式
- 日志存储,支持stdout、file,甚至是db,且同一条日志能同时记录到多种存储
- 自动分片,按照size或time(如果存储到file或db时)
- 自动清理,根据最大容量或最长时间,自动清理历史日志,例如只保留最近1个月日志、只保留1GB日志
基于以上需求,在golang的log
基础上,我实现了更实用的logger,支持日志等级、代码行号的展示。
其他一些功能,根据项目需要,可以择时实现。
代码并不复杂,直接上代码。
2. 完整代码
package logger
import (
"fmt"
"log"
"os"
"path/filepath"
"runtime"
)
type Level int
var (
DefaultPrefix = ""
DefaultCallerDepth = 2
logger *log.Logger
isDebug = false
levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
)
const (
DEBUG Level = iota
INFO
WARNING
ERROR
FATAL
)
// Setup initialize the log instance
func Setup() {
logger = log.New(os.Stdout, DefaultPrefix, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lmsgprefix)
}
func SetDebugMode(debug bool) {
isDebug = debug
}
// Debug output logs at debug level
func Debug(v ...interface{}) {
if !isDebug {
return
}
setPrefix(DEBUG)
logger.Println(v...)
}
// Info output logs at info level
func Info(v ...interface{}) {
setPrefix(INFO)
logger.Println(v...)
}
// Warn output logs at warn level
func Warn(v ...interface{}) {
setPrefix(WARNING)
logger.Println(v...)
}
// Error output logs at error level
func Error(v ...interface{}) {
setPrefix(ERROR)
logger.Println(v...)
}
// Fatal output logs at fatal level
func Fatal(v ...interface{}) {
setPrefix(FATAL)
logger.Fatalln(v...)
}
// setPrefix set the prefix of the log output
func setPrefix(level Level) {
var logPrefix string
_, file, line, ok := runtime.Caller(DefaultCallerDepth)
if ok {
logPrefix = fmt.Sprintf("%s - %s:%d ", levelFlags[level], filepath.Base(file), line)
} else {
logPrefix = fmt.Sprintf("%s ", levelFlags[level])
}
logger.SetPrefix(logPrefix)
}
3. 使用方法
- 代码
func main() {
logger.Setup()
logger.SetDebugMode(true)
logger.Info("Current App Version 0.0.11")
}
- 日志
% go run main.go
2023/04/21 09:38:03.749418 INFO - main.go:71 Current App Version 0.0.11
2023/04/21 09:38:03.907148 DEBUG - init.go:68 Created index job name name_1