2
0
mirror of https://gitee.ltd/lxh/logger.git synced 2025-10-23 14:56:16 +08:00

7 Commits

Author SHA1 Message Date
李寻欢
ebae5c29cd 🐛 Fix a bug. 2022-05-18 18:53:17 +08:00
李寻欢
4e2f8f6466 📝 完善readme 2022-05-18 18:13:20 +08:00
李寻欢
40840390ae 🎨 优化GORM处理 2022-05-18 18:11:43 +08:00
李寻欢
27dd190fbd 🎨 优化日志用法 2022-05-18 17:43:19 +08:00
李寻欢
3ea919e06c 🎨 配置优化 2022-05-18 11:17:22 +08:00
李寻欢
52e9be31c3 🎨 算了,撤回了 2022-05-18 11:11:26 +08:00
李寻欢
b587bc4ceb 🎨 优化日志打印的调用行号为准确行号 2022-05-18 11:07:30 +08:00
8 changed files with 118 additions and 30 deletions

3
.gitignore vendored
View File

@@ -1,5 +1,4 @@
.idea .idea
vendor vendor
logs logs
cache cache
log

View File

@@ -2,22 +2,22 @@ package logger
import "fmt" import "fmt"
type mode int type mode string
var ( const (
Dev mode = 0 Dev mode = "development"
Prod mode = 1 Prod mode = "production"
) )
// LogConfig 日志配置 // LogConfig 日志配置
type LogConfig struct { type LogConfig struct {
Mode mode `env:"LOG_MODE"` // dev, prod Mode mode `env:"LOG_MODE" envDefault:"production"` // dev, prod
LokiEnable bool `env:"LOG_LOKI_ENABLE"` // 是否启用Loki LokiEnable bool `env:"LOG_LOKI_ENABLE"` // 是否启用Loki
FileEnable bool `env:"LOG_FILE_ENABLE"` // 是否输出到文件 FileEnable bool `env:"LOG_FILE_ENABLE"` // 是否输出到文件
LokiHost string `env:"LOG_LOKI_HOST"` // Loki地址 LokiHost string `env:"LOG_LOKI_HOST"` // Loki地址
LokiPort int `env:"LOG_LOKI_PORT"` // Loki端口 LokiPort int `env:"LOG_LOKI_PORT"` // Loki端口
LokiSource string `env:"LOG_LOKI_SOURCE_NAME"` // Loki的source名称 LokiSource string `env:"LOG_LOKI_SOURCE_NAME"` // Loki的source名称
LokiJob string `env:"LOG_LOKI_JOB_NAME"` // Loki的job名称 LokiJob string `env:"LOG_LOKI_JOB_NAME"` // Loki的job名称
} }
func (c LogConfig) getLokiPushURL() string { func (c LogConfig) getLokiPushURL() string {

11
gorm.go
View File

@@ -4,10 +4,13 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"go.uber.org/zap"
gl "gorm.io/gorm/logger" gl "gorm.io/gorm/logger"
"time" "time"
) )
var gormZap *zap.SugaredLogger
// 基于Gorm的日志实现 // 基于Gorm的日志实现
type gormLogger struct { type gormLogger struct {
gl.Config gl.Config
@@ -25,7 +28,7 @@ func (l gormLogger) Info(ctx context.Context, msg string, data ...interface{}) {
if l.LogLevel >= gl.Info { if l.LogLevel >= gl.Info {
// // 去掉第一行 // // 去掉第一行
// msg = strings.Join(strings.Split(msg, "\n")[1:], " ") // msg = strings.Join(strings.Split(msg, "\n")[1:], " ")
// Say.Info(msg) // gormZap.Info(msg)
// //
// l.Printf(msg, append([]interface{}{utils.FileWithLineNum()}, data...)...) // l.Printf(msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
} }
@@ -60,12 +63,12 @@ func (l gormLogger) Trace(ctx context.Context, begin time.Time, fc func() (strin
switch { switch {
case err != nil && l.LogLevel >= gl.Error && (!errors.Is(err, gl.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError): case err != nil && l.LogLevel >= gl.Error && (!errors.Is(err, gl.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError):
Say.Errorf("%s -> %s", err.Error(), sql) gormZap.Errorf("%s -> %s", err.Error(), sql)
case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= gl.Warn: case elapsed > l.SlowThreshold && l.SlowThreshold != 0 && l.LogLevel >= gl.Warn:
slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold) slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold)
Say.Warnf("%v -> %v", slowLog, sql) gormZap.Warnf("%v -> %v", slowLog, sql)
case l.LogLevel == gl.Info: case l.LogLevel == gl.Info:
Say.Info(msg) gormZap.Info(msg)
} }
} }

View File

@@ -1,6 +1,7 @@
package logger package logger
import ( import (
"gitee.ltd/lxh/logger/log"
"gorm.io/driver/mysql" "gorm.io/driver/mysql"
"gorm.io/gorm" "gorm.io/gorm"
"testing" "testing"
@@ -11,7 +12,7 @@ func TestGormLogger(t *testing.T) {
engine, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: DefaultGormLogger()}) engine, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: DefaultGormLogger()})
if err != nil { if err != nil {
Say.Panicf("mysql connect error: %s", err.Error()) log.Panicf("mysql connect error: %s", err.Error())
} }
var count int64 var count int64

75
log/say.go Normal file
View File

@@ -0,0 +1,75 @@
package log
import "go.uber.org/zap"
// Debug uses fmt.Sprint to construct and log a message.
func Debug(args ...interface{}) {
defer zap.S().Sync()
zap.S().Debug(args...)
}
// Info uses fmt.Sprint to construct and log a message.
func Info(args ...interface{}) {
defer zap.S().Sync()
zap.S().Info(args...)
}
// Warn uses fmt.Sprint to construct and log a message.
func Warn(args ...interface{}) {
defer zap.S().Sync()
zap.S().Warn(args...)
}
// Error uses fmt.Sprint to construct and log a message.
func Error(args ...interface{}) {
defer zap.S().Sync()
zap.S().Error(args...)
}
// Panic uses fmt.Sprint to construct and log a message, then panics.
func Panic(args ...interface{}) {
defer zap.S().Sync()
zap.S().Panic(args...)
}
// Fatal uses fmt.Sprint to construct and log a message, then calls os.Exit.
func Fatal(args ...interface{}) {
defer zap.S().Sync()
zap.S().Fatal(args...)
}
// Debugf uses fmt.Sprintf to log a templated message.
func Debugf(template string, args ...interface{}) {
defer zap.S().Sync()
zap.S().Debugf(template, args...)
}
// Infof uses fmt.Sprintf to log a templated message.
func Infof(template string, args ...interface{}) {
defer zap.S().Sync()
zap.S().Infof(template, args...)
}
// Warnf uses fmt.Sprintf to log a templated message.
func Warnf(template string, args ...interface{}) {
defer zap.S().Sync()
zap.S().Warnf(template, args...)
}
// Errorf uses fmt.Sprintf to log a templated message.
func Errorf(template string, args ...interface{}) {
defer zap.S().Sync()
zap.S().Errorf(template, args...)
}
// Panicf uses fmt.Sprintf to log a templated message, then panics.
func Panicf(template string, args ...interface{}) {
defer zap.S().Sync()
zap.S().Panicf(template, args...)
}
// Fatalf uses fmt.Sprintf to log a templated message, then calls os.Exit.
func Fatalf(template string, args ...interface{}) {
defer zap.S().Sync()
zap.S().Fatalf(template, args...)
}

View File

@@ -8,17 +8,21 @@ import (
) )
var config LogConfig var config LogConfig
var Say *zap.SugaredLogger var initialized bool
// 避免异常在第一次调用时初始化一个只打印到控制台的logger // 避免异常在第一次调用时初始化一个只打印到控制台的logger
func init() { func init() {
if Say == nil { if !initialized {
// 从环境变量读取配置 // 从环境变量读取配置
var c LogConfig var c LogConfig
if err := env.Parse(&c); err != nil { if err := env.Parse(&c); err != nil {
fmt.Println("日志配置解析错误: " + err.Error()) fmt.Println("日志配置解析错误: " + err.Error())
c = LogConfig{Mode: Dev, LokiEnable: false, FileEnable: false} c = LogConfig{Mode: Dev, LokiEnable: false, FileEnable: false}
} }
// 如果值错了直接默认为Prod
if c.Mode != Dev && c.Mode != Prod {
c.Mode = Prod
}
InitLogger(c) InitLogger(c)
} }
} }
@@ -42,7 +46,10 @@ func InitLogger(c LogConfig) {
} }
// 增加 caller 信息 // 增加 caller 信息
logger := zap.New(zapcore.NewTee(cores...), zap.AddCaller()) // AddCallerSkip 输出的文件名和行号是调用封装函数的位置,而不是调用日志函数的位置
Say = logger.Sugar() logger := zap.New(zapcore.NewTee(cores...), zap.AddCaller(), zap.AddCallerSkip(1))
initialized = true
// 给GORM单独生成一个
gormZap = zap.New(zapcore.NewTee(cores...), zap.AddCaller(), zap.AddCallerSkip(3)).Sugar()
zap.ReplaceGlobals(logger) zap.ReplaceGlobals(logger)
} }

View File

@@ -1,23 +1,23 @@
package logger package logger
import ( import (
"go.uber.org/zap" "gitee.ltd/lxh/logger/log"
"testing" "testing"
"time" "time"
) )
func TestLogger(t *testing.T) { func TestLogger(t *testing.T) {
InitLogger(LogConfig{Mode: Dev, LokiEnable: false, FileEnable: true}) InitLogger(LogConfig{Mode: Dev, LokiEnable: false, FileEnable: true})
Say.Debug("芜湖") log.Debug("芜湖")
} }
func TestLogger1(t *testing.T) { func TestLogger1(t *testing.T) {
Say.Info("我是测试消息") log.Info("我是测试消息")
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
} }
func TestLogger2(t *testing.T) { func TestLogger2(t *testing.T) {
InitLogger(LogConfig{Mode: Dev, LokiEnable: false, FileEnable: true}) InitLogger(LogConfig{Mode: Dev, LokiEnable: false, FileEnable: true})
zap.S().Info("我是测试消息") log.Info("我是测试消息")
time.Sleep(5 * time.Second) //time.Sleep(5 * time.Second)
} }

View File

@@ -5,17 +5,20 @@
```go ```go
package main package main
import "gitee.ltd/lxh/logger" import (
"gitee.ltd/lxh/logger"
"gitee.ltd/lxh/logger/log"
)
func main() { func main() {
logger.InitLogger(logger.LogConfig{Mode: logger.Dev, LokiEnable: false, FileEnable: true}) logger.InitLogger(logger.LogConfig{Mode: logger.Dev, LokiEnable: false, FileEnable: true})
logger.Say.Debug("芜湖") log.Debug("芜湖")
} }
``` ```
### 环境变量 ### 环境变量
```shell ```shell
export LOG_MODE=0 # 0: dev, 1: prod export LOG_MODE=0 # development | production
export LOG_LOKI_ENABLE=1 # 是否启用Loki 0: disable, 1: enable export LOG_LOKI_ENABLE=1 # 是否启用Loki 0: disable, 1: enable
export LOG_FILE_ENABLE=0 # 是否启用输出到文件 0: disable, 1: enable export LOG_FILE_ENABLE=0 # 是否启用输出到文件 0: disable, 1: enable
export LOG_LOKI_HOST=10.0.0.31 # Loki地址 export LOG_LOKI_HOST=10.0.0.31 # Loki地址