配置文件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日志打印测试")
}

最新文章

  1. 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>
  2. cookie和session简单的用法
  3. MySQL命令行导出数据库
  4. Java程序员的日常 —— 多进程开发
  5. [译]- 6-1 排列窗体上的控件(Laying Out Widgets on a Form)
  6. 关于纯css布局的概况
  7. 去掉NavigationBar底部的黑线
  8. .Net项目版本号的生成
  9. HTML之一 符号实体
  10. ARM公布“物联网”嵌入式mbed OS系统软件平台
  11. MeasureSpec介绍
  12. 使用ntfs的磁盘映射功能
  13. android 根据域名得到IP
  14. C# 词法分析器
  15. 粒子滤波(PF:Particle Filter)
  16. html 转 PDF wkhtmltopdf image 不能显示的问题
  17. 扫AR
  18. Qt编写GIF录屏工具(开源)
  19. discuz上传头像失败怎么解决
  20. 解决多进程中APScheduler重复运行的问题

热门文章

  1. linux 让.net 控制台后台运行
  2. [特征工程] GBDT
  3. Mysql资料 用户权限详解
  4. python模块(三)
  5. std::function介绍 -转载
  6. JAVA匹配html中所有img标签
  7. 【LeetCode】505. The Maze II 解题报告(C++)
  8. 【转】最短路径——Dijkstra算法和Floyd算法
  9. 高并发 IO 模型
  10. Dubbo 的设计思想