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

4 Commits

Author SHA1 Message Date
李寻欢
40a3dc9339 🎨 优化gorm日志 2022-05-19 09:01:05 +08:00
李寻欢
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
5 changed files with 50 additions and 14 deletions

18
gorm.go
View File

@@ -4,10 +4,13 @@ import (
"context"
"errors"
"fmt"
"go.uber.org/zap"
gl "gorm.io/gorm/logger"
"time"
)
var gormZap *zap.SugaredLogger
// 基于Gorm的日志实现
type gormLogger struct {
gl.Config
@@ -25,7 +28,7 @@ func (l gormLogger) Info(ctx context.Context, msg string, data ...interface{}) {
if l.LogLevel >= gl.Info {
// // 去掉第一行
// msg = strings.Join(strings.Split(msg, "\n")[1:], " ")
// Say.Info(msg)
// gormZap.Info(msg)
//
// 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 {
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:
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:
Say.Info(msg)
gormZap.Info(msg)
}
}
@@ -76,10 +79,15 @@ func NewGormLoggerWithConfig(config gl.Config) gl.Interface {
// DefaultGormLogger 默认的日志实现
func DefaultGormLogger() gl.Interface {
// 默认日志级别为Info如果是生产环境就是Error
logLevel := gl.Info
if config.Mode == Prod {
logLevel = gl.Error
}
return &gormLogger{gl.Config{
SlowThreshold: time.Second, // Slow SQL threshold
IgnoreRecordNotFoundError: false, // 忽略没找到结果的错误
LogLevel: gl.Info, // Log level
LogLevel: logLevel, // Log level
Colorful: false, // Disable color
}}
}

View File

@@ -1,9 +1,12 @@
package logger
import (
"gitee.ltd/lxh/logger/log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
gl "gorm.io/gorm/logger"
"testing"
"time"
)
func TestGormLogger(t *testing.T) {
@@ -11,7 +14,27 @@ func TestGormLogger(t *testing.T) {
engine, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: DefaultGormLogger()})
if err != nil {
Say.Panicf("mysql connect error: %s", err.Error())
log.Panicf("mysql connect error: %s", err.Error())
}
var count int64
if err := engine.Table("t_tenant").Count(&count).Error; err != nil {
t.Log(err)
}
t.Logf("count: %d", count)
}
func TestGormLoggerWithConfig(t *testing.T) {
dsn := "saas:saas123@tcp(10.11.0.10:3307)/saas_tenant?charset=utf8mb4&parseTime=True&loc=Local"
engine, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: NewGormLoggerWithConfig(gl.Config{
SlowThreshold: time.Second, // Slow SQL threshold
IgnoreRecordNotFoundError: false, // 忽略没找到结果的错误
LogLevel: gl.Warn, // Log level
Colorful: false, // Disable color
})})
if err != nil {
log.Panicf("mysql connect error: %s", err.Error())
}
var count int64

View File

@@ -8,11 +8,11 @@ import (
)
var config LogConfig
var Say *zap.SugaredLogger
var initialized bool
// 避免异常在第一次调用时初始化一个只打印到控制台的logger
func init() {
if Say == nil {
if !initialized {
// 从环境变量读取配置
var c LogConfig
if err := env.Parse(&c); err != nil {
@@ -48,6 +48,8 @@ func InitLogger(c LogConfig) {
// 增加 caller 信息
// AddCallerSkip 输出的文件名和行号是调用封装函数的位置,而不是调用日志函数的位置
logger := zap.New(zapcore.NewTee(cores...), zap.AddCaller(), zap.AddCallerSkip(1))
Say = logger.Sugar()
initialized = true
// 给GORM单独生成一个
gormZap = zap.New(zapcore.NewTee(cores...), zap.AddCaller(), zap.AddCallerSkip(3)).Sugar()
zap.ReplaceGlobals(logger)
}

View File

@@ -8,11 +8,11 @@ import (
func TestLogger(t *testing.T) {
InitLogger(LogConfig{Mode: Dev, LokiEnable: false, FileEnable: true})
Say.Debug("芜湖")
log.Debug("芜湖")
}
func TestLogger1(t *testing.T) {
Say.Info("我是测试消息")
log.Info("我是测试消息")
time.Sleep(5 * time.Second)
}

View File

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