Go 中使用日志模块

之前使用过go自带的logseelog日志,后来又发现一个好用的日志beego日志模块
在原有的日志中加入了一个tag,只要设置要显示的tag后才会打印出日志,没有设置的tag不显示。

1、安装

go get github.com/beego/beego/v2/core/logs

2、引入包

import (
    "github.com/beego/beego/v2/core/logs"
)

3、初始化配置

func init() {
    Log = logs.NewLogger(200)

    // 日志输出调用的文件名和文件行号,默认为false
    Log.EnableFuncCallDepth(true)

    // 如果你的应用自己封装了调用 log 包,那么需要设置 SetLogFuncCallDepth
    // 默认是 2,也就是直接调用的层级,如果你封装了多层,那么需要根据自己的需求进行调整.
    Log.SetLogFuncCallDepth(3)
}

4、设置日志文件

var Tags = make(map[string]bool)

// 初始化日志参数
// logWay: file-输出到文件;console-输出到控制台
// logFile: 日志文件
// logLevel: 日志等级
// maxDays: 日志保留天数
// disableLogColor: 是否显示颜色
// tags: 日志显示tag
func InitLog(logWay string, logFile string, logLevel string, maxDays int64, disableLogColor bool, tags []string) {
    setLogFile(logWay, logFile, maxDays, disableLogColor)
    setLogLevel(logLevel)
    setTags(tags)
}

// 设置显示tag
func setTags(tags []string)  {
    if tags != nil {
        for _, tag := range tags {
            Tags[tag] = true
        }
    }
}

// 设置日志文件参数
// logWay: file or console
func setLogFile(logWay string, logFile string, maxdays int64, disableLogColor bool) {
    if logWay == "console" {
        params := ""
        if disableLogColor {
            params = fmt.Sprintf(`{"color": false}`)
        }
        _ = Log.SetLogger("console", params)
    } else {
        params := fmt.Sprintf(`{"filename": "%s", "maxdays": %d}`, logFile, maxdays)
        _ = Log.SetLogger("file", params)
    }
}

// 设置日志显示等级
// value: error, warning, info, debug, trace
func setLogLevel(logLevel string) {
    level := 4 // warning
    switch logLevel {
    case "error":
        level = 3
    case "warn":
        level = 4
    case "info":
        level = 6
    case "debug":
        level = 7
    case "trace":
        level = 8
    default:
        level = 4
    }
    Log.SetLevel(level)
}

// 获取tag是否显示
func getTag(tag string) (msg string, show bool) {
    if _, ok := Tags[tag]; !ok {
        return
    }

    msg = "[Tag:"+tag+"] "
    show = true

    return
}

5、日志接口封装

// wrap log
func Error(tag, format string, v ...interface{}) {
    tag, show := getTag(tag)
    if show {
        Log.Error(tag+format, v...)
    }
}

func Warn(tag,format string, v ...interface{}) {
    tag, show := getTag(tag)
    if show {
        Log.Warn(tag+format, v...)
    }
}

func Info(tag,format string, v ...interface{}) {
    tag, show := getTag(tag)
    if show {
        Log.Info(tag+format, v...)
    }
}

func Debug(tag,format string, v ...interface{}) {
    tag, show := getTag(tag)
    if show {
        Log.Debug(tag+format, v...)
    }
}

func Trace(tag,format string, v ...interface{}) {
    tag, show := getTag(tag)
    if show {
        Log.Trace(tag+format, v...)
    }
}

6、测试

package main

import (
    "github.com/zngw/log"
)

func main() {
    // 不设置显示tag
    // log.Init("",nil)

    // 初始化日志
    log.InitLog("file","logs/file.log","trace",30,true,[]string{"sys","net"})

    // 输出日志: 2019-11-15 01:06:01.215 [D] [main.go:15]  [Tag:sys] [Hello World]
    log.Trace("sys","Hello World")

    // 输出日志: 2019-11-15 01:06:01.215 [D] [main.go:18]  [Tag:net] [Hello Golang]
    log.Trace("net","Hello Golang")

    // 这条日志不在显示的tag内,故不输出
    log.Trace("test","Hello zngw")

    // 输出错误日志: 2019-11-15 01:06:01.215 [E] [main.go:24]  [Tag:net] [Error]
    log.Error("sys","Error")
}

完整代码参考:https://github.com/zngw/log

0%