Go的日志库go-logging

配置文件config.yaml

log:
  prefix: '[MY-LOG] '
  log-file: true
  stdout: 'DEBUG'
  file: 'DEBUG'

config/config.go

package config

type Log struct {
        Prefix  string `mapstructure:"prefix" json:"prefix"`
        LogFile bool   `mapstructure:"log-file" json:"logFile"`
        Stdout  string `mapstructure:"stdout" json:"stdout"`
        File    string `mapstructure:"file" json:"file"`
}

type Config struct {
        Log Log `json:"log"`
}

global/global.go

package global

import (
        oplogging "github.com/op/go-logging"
        "github.com/spf13/viper"
        "go_Logger/config"
)

var (
        CONFIG config.Config
        VP     *viper.Viper
        LOG    *oplogging.Logger
)

读取配置文件

//const defaultConfigFile = "config/config.json"
const defaultConfigFile = "config/config.yaml"

func init() {
        v := viper.New()
        v.SetConfigFile(defaultConfigFile)
        err := v.ReadInConfig()
        if err != nil {
                panic(fmt.Errorf("Fatal error config file: %s \n", err))
        }
        v.WatchConfig()

        v.OnConfigChange(func(e fsnotify.Event) {
                fmt.Println("config file changed:", e.Name)
                if err := v.Unmarshal(&global.CONFIG); err != nil {
                        fmt.Println(err)
                }
        })
        if err := v.Unmarshal(&global.CONFIG); err != nil {
                fmt.Println(err)
        }
        global.VP = v
}

initizlize/go-logging.go

package initizlize

import (
        "fmt"
        rotatelogs "github.com/lestrrat/go-file-rotatelogs"
        oplogging "github.com/op/go-logging"
        "go_Logger/config"
        "go_Logger/global"
        "go_Logger/utils"
        "io"
        "os"
        "strings"
        "time"
)

const (
        logDir      = "log"
        logSoftLink = "latest_log"
        module      = "go_Logger"
)

var (
        defaultFormatter = `%{color}%{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
)

func InitGlobalLog() {
        c := global.CONFIG.Log
        if c.Prefix == "" {
                _ = fmt.Errorf("logger prefix not found")
        }
        logger := oplogging.MustGetLogger(module)
        var backends []oplogging.Backend
        backends = registerStdout(c, backends)
        backends = registerFile(c, backends)

        oplogging.SetBackend(backends...)
        global.LOG = logger
}

func registerStdout(c config.Log, backends []oplogging.Backend) []oplogging.Backend {
        if c.Stdout != "" {
                level, err := oplogging.LogLevel(c.Stdout)
                if err != nil {
                        fmt.Println(err)
                }
                backends = append(backends, createBackend(os.Stdout, c, level))
        }

        return backends
}

func registerFile(c config.Log, backends []oplogging.Backend) []oplogging.Backend {
        if c.File != "" {
                if ok, _ := utils.PathExists(logDir); !ok {
                        // directory not exist
                        fmt.Println("create log directory")
                        _ = os.Mkdir(logDir, os.ModePerm)
                }
                fileWriter, err := rotatelogs.New(
                        logDir+string(os.PathSeparator)+"%Y-%m-%d-%H-%M.log",
                        // generate soft link, point to latest log file
                        //rotatelogs.WithLinkName(logSoftLink),
                        // maximum time to save log files
                        rotatelogs.WithMaxAge(7*24*time.Hour),
                        // time period of log file switching
                        rotatelogs.WithRotationTime(24*time.Hour),
                )
                if err != nil {
                        fmt.Println(err)
                        return backends
                }
                level, err := oplogging.LogLevel(c.File)
                if err != nil {
                        fmt.Println(err)
                }
                backends = append(backends, createBackend(fileWriter, c, level))
        }

        return backends
}

func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.Backend {
        backend := oplogging.NewLogBackend(w, c.Prefix, 0)
        stdoutWriter := false
        if w == os.Stdout {
                stdoutWriter = true
        }
        format := getLogFormatter(c, stdoutWriter)
        backendLeveled := oplogging.AddModuleLevel(oplogging.NewBackendFormatter(backend, format))
        backendLeveled.SetLevel(level, module)
        return backendLeveled
}

func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
        pattern := defaultFormatter
        if !stdoutWriter {
                // Color is only required for console output
                // Other writers don't need %{color} tag
                pattern = strings.Replace(pattern, "%{color:bold}", "", -1)
                pattern = strings.Replace(pattern, "%{color:reset}", "", -1)
        }
        if !c.LogFile {
                // Remove %{logfile} tag
                pattern = strings.Replace(pattern, "%{longfile}", "", -1)
        }
        return oplogging.MustStringFormatter(pattern)
}

 main.go

package main

import (
        "go_Logger/global"
        initizlize "go_Logger/initialize"
)

func main() {
        initizlize.InitGlobalLog()
        global.LOG.Debug("go-logging日志打印测试")
        global.LOG.Warning("go-logging日志打印测试")
        global.LOG.Error("go-logging日志打印测试")
}