作用域 matplotlib boost flexbox jaxb swift2 bootstrap后台管理模板 jquery绑定click事件 js事件绑定 jquery事件绑定 vim跳到文件末尾 input边框颜色 maya曲线建模 matlab区分大小写吗 反函数的二阶导数 python运行环境 mysql建表 python生成随机数 python或运算 python导入文件 java继承 java环境部署 心理学与生活下载 rendercontrol acmecadconverter subprocess 骁龙435 js转int labview宝典 整站系统 滑动门代码 战斗的召唤 微信砍价软件 小米8游戏模式 ps怎么画漫画 lol游戏环境异常 淘宝图片下载器 微信小程序循环 id书籍排版教程 ps测量工具
当前位置: 首页 > 学习教程  > 编程语言

【go packages(三)】一杯咖啡的文章-log 包

2020/11/24 10:01:35 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

文章稍微有点长,请耐心看,花drink一杯咖啡(请试试美式)的时间就好!冲🚀 附上源码地址,记得Star下哈~ Github源码地址 导语:go packages之路–log 包的剖析 作者:变优秀的小白 Github&#xff…

文章稍微有点长,请耐心看,花drink一杯咖啡(请试试美式)的时间就好!冲🚀
附上源码地址,记得Star下哈~

  • Github源码地址

导语go packages之路–log 包的剖析

作者变优秀的小白

Github关注YX-XiaoBai

爱好Americano More Ice !

log

Go语言内置的log包实现了简单的日志服务

使用Logger

log包定义了Logger类型,该类型提供了一些格式化输出的方法

直接调用下面三个方法会比自己创建一个logger对象更easy

  • Print系列(Print|Printf|Println)
  • Fatal系列(Fatal|Fatalf|Fatalln)
  • Panic系列(Panic|Panicf|Panicln)

举个简单的例子

log.Println("This is a normal log。")
v := "normal"
log.Printf("this is a %s log。\n", v)
log.Fatalln("this is a log from fatal")
log.Panicln("this is a log from panic")

输出信息如下(日期、时间,默认输出到系统的标准错误)

2020/11/23 15:30:11 This is a normal log
2020/11/23 15:30:11 this is a normal log
2020/11/23 15:30:11 this is a log from fatal
exit status 1

Fatal系列函数会在写入日志信息后调用os.Exit(1)Panic系列函数会在写入日志信息后panic

配置logger

默认logger只提供了时间和日志信息,我们往往不够用,所以log标准库还提供了设置的方法

  • Flags函数会返回标准logger的输出配置
  • SetFlags函数用来设置标准logger的输出配置
func Flags() int
func SetFlags(flag int)

flag选项

log标准库提供的flag选项,是一系列已定义好的常量

const (
    // 控制输出日志信息的细节,不能控制输出的顺序和格式。
    // 输出的日志在每一项后会有一个冒号分隔:例如2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
    Ldate         = 1 << iota     // 日期:2009/01/23
    Ltime                         // 时间:01:23:23
    Lmicroseconds                 // 微秒级别的时间:01:23:23.123123(用于增强Ltime位)
    Llongfile                     // 文件全路径名+行号: /a/b/c/d.go:23
    Lshortfile                    // 文件名+行号:d.go:23(会覆盖掉Llongfile)
    LUTC                          // 使用UTC时间
    LstdFlags     = Ldate | Ltime // 标准logger的初始值
)

直接在log打印前使用log.SetFlags设置下输出选项即可

og.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
log.Println("This is a normal log.")

输出结果

$ go run log.go
2020/11/23 15:43:13.804053 /Users/lidean/github_project/fucking-go-library/log/main/log.go:28: This is a normal log.

配置log前缀

log库还提供了关于日志信息前缀的两个方法

func Prefix() string
func SetPrefix(prefix string)
  • Prefix函数用来查看标准logger的输出前缀
  • SetPrefix函数用来设置输出前缀

举个例子

log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
log.Println("This is a normal log")
log.SetPrefix("[pprof]")
log.Println("This is a normal log")

输出结果

2020/11/23 16:00:34.814164 /Users/lidean/github_project/fucking-go-library/log/main/log.go:32: This is a normal log
[pprof]2020/11/23 16:00:34.814294 /Users/lidean/github_project/fucking-go-library/log/main/log.go:34: This is a normal log

配置log输出位置

语法

func SetOutput(w io.Writer)

SetOutput函数用来设置标准logger的输出目的地,默认是标准错误输出

举个例子,将日志输出到同目录下的xx.log

logFile, err := os.OpenFile("./xx.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
    fmt.Println("open log file failed, err:", err)
    return
}
log.SetOutput(logFile)
log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
log.Println("This is a normal log")
log.SetPrefix("[XiaoBai]")
log.Println("This is a normal log")

如果你要使用标准的logger,我们通常会把上面的配置操作写到init函数中,如下

func init() {
    logFile, err := os.OpenFile("./xx.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        fmt.Println("open log file failed, err:", err)
        return
    }
    log.SetOutput(logFile)
    log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
}

执行成功后,会生成xx.log文件,内容如下

2020/11/23 16:08:44.167391 /Users/lidean/github_project/fucking-go-library/log/main/log.go:48: This is a normal log
[XiaoBai]2020/11/23 16:08:44.167507 /Users/lidean/github_project/fucking-go-library/log/main/log.go:50: This is a normal log

创建logger

log库中还提供了一个创建新logger对象的构造函数New,支持我们创建自己的logger示例。New函数的签名如下

func New(out io.Writer, prefix string, flag int) *Logger

创建logger

logger := log.New(os.Stdout, "<New>", log.Lshortfile|log.Ldate|log.Ltime)
logger.Println("this is a custom logger")

输出结果

<New>2020/11/23 16:21:17 log.go:53: this is a custom logger

个人总结

总的来说,log 库的功能还是十分有限的,遇到需要记录不用级别日志时就不够用了,第三方的日志库有 logrus / zap 等等。
整个文档来说,首先是讲述了三个格式化输出的方法,然后讲述了 log 配合可以定义常量后自定义 log 输出、配置 log 前缀以及输出在一个单独的log文件中,
最后介绍使用 log.New() 方法去创建一个自定义 log

结束语:大家如果遇到什么疑问或者建议的地方,可直接留言评论!作者看到会马上一一回复!

如果觉得小白此文章不错或对你有所帮助,留下💫一键三连💫!❤️ni!


本文链接: http://www.dtmao.cc/news_show_400209.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?