• 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 
    ", 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日志打印测试")
    }
    
  • 相关阅读:
    maven dependencies 里面的包怎么导出
    webUploader react 接口设计
    HTML5 History API实现无刷新跳转
    Object.defineproperty实现数据和视图的联动
    jsLoader、cssLoader、imageLoader
    【转】前端工程化-公共模块的依赖和常用的工作流
    JDBC详解
    正则表达式
    【GOF23设计模式】备忘录模式
    【GOF23设计模式】观察者模式
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/12863404.html
Copyright © 2020-2023  润新知