gin & zap & logstash

自定義zap logger,使用了https://github.com/elastic/ecs-logging-go-zap

package log

import (
    "os"
    "time"

    "github.com/natefinch/lumberjack"
    "github.com/spf13/viper"
    "go.elastic.co/ecszap"
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "easymesh.net/search-service/util"
)

type Field = zap.Field

var (
    Logger  *zap.Logger
    String  = zap.String
    Any     = zap.Any
    Int     = zap.Int
    Float32 = zap.Float32
)

func InitLogger(viper *viper.Viper) {
    hook := lumberjack.Logger{
        Filename:   viper.GetString("logging.file"),
        MaxSize:    10,
        MaxBackups: 30,
        MaxAge:     7,
        Compress:   true,
    }
    write := zapcore.AddSync(&hook)

    var level zapcore.Level

    switch viper.GetString("logging.level") {
    case "debug":
        level = zap.DebugLevel
    case "info":
        level = zap.InfoLevel
    case "error":
        level = zap.ErrorLevel
    case "warn":
        level = zap.WarnLevel
    default:
        level = zap.InfoLevel
    }

    encoderConfig := ecszap.NewDefaultEncoderConfig()

    var writes = []zapcore.WriteSyncer{write}

    if level == zap.DebugLevel {
        writes = append(writes, zapcore.AddSync(os.Stdout))
    }

    core := ecszap.NewCore(
        encoderConfig,
        zapcore.NewMultiWriteSyncer(writes...),
        level,
    )

    Logger = zap.New(
        core, zap.AddCaller(),
        zap.Fields(
            zap.String("application", viper.GetString("spring.application.name")),
            zap.String("serverIp", util.LocalIp()),
            zap.Int("port", viper.GetInt("server.port")),
            zap.String("profile", viper.GetString("spring.profiles.active")),
            zap.Any("logTime", time.Now().Format("2006-01-02 15:04:05.000")),
        ),
    )
}

設(shè)置gin使用自定義的logger

package router

import (
    "fmt"

    ginzap "github.com/gin-contrib/zap"
    "github.com/gin-gonic/gin"
    "go.uber.org/zap"
    "easymesh.net/search-service/log"
)

func NewRouter() *gin.Engine {
    gin.SetMode(gin.ReleaseMode)

    server := gin.Default()

    server.Use(Recovery)
    server.Use(ginzap.Ginzap(log.Logger, "2006-01-02 15:04:05.000", false))

    return server
}

func Recovery(c *gin.Context) {
    defer func() {
        if r := recover(); r != nil {
            log.Logger.Error("系統(tǒng)內(nèi)部錯誤", zap.Error(fmt.Errorf("%v", r)))
        }
    }()
    c.Next()
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容