日志模块

这是一个用来处理日志的库,它的设计思路来自于 database/sql,目前支持的引擎有 file、console、net、smtp、es、slack。

例子参考beego-example (opens new window)下的logs部分

快速开始

首先引入包:

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

然后添加输出引擎(log 支持同时输出到多个引擎),这里我们以 console 为例,第一个参数是引擎名:

  1. logs.SetLogger(logs.AdapterConsole)

添加输出引擎也支持第二个参数,用来表示配置信息,对于不同的引擎来说,其配置也是不同的。详细的配置请看下面介绍:

  1. logs.SetLogger(logs.AdapterFile,`{"filename":"project.log","level":7,"maxlines":0,"maxsize":0,"daily":true,"maxdays":10,"color":true}`)

然后我们就可以在我们的逻辑中开始任意的使用了:

  1. package main
  2. import (
  3. "github.com/beego/beego/v2/core/logs"
  4. )
  5. func main() {
  6. //an official log.Logger
  7. l := logs.GetLogger()
  8. l.Println("this is a message of http")
  9. //an official log.Logger with prefix ORM
  10. logs.GetLogger("ORM").Println("this is a message of orm")
  11. logs.Debug("my book is bought in the year of ", 2016)
  12. logs.Info("this %s cat is %v years old", "yellow", 3)
  13. logs.Warn("json is a type of kv like", map[string]int{"key": 2016})
  14. logs.Error(1024, "is a very", "good game")
  15. logs.Critical("oh,crash")
  16. }

多个实例

一般推荐使用通用方式进行日志,但依然支持单独声明来使用独立的日志

  1. package main
  2. import (
  3. "github.com/beego/beego/v2/core/logs"
  4. )
  5. func main() {
  6. log := logs.NewLogger()
  7. log.SetLogger(logs.AdapterConsole)
  8. log.Debug("this is a debug message")
  9. }

输出文件名和行号

日志默认不输出调用的文件名和文件行号,如果你期望输出调用的文件名和文件行号,可以如下设置

  1. logs.EnableFuncCallDepth(true)

开启传入参数 true,关闭传入参数 false,默认是关闭的.

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

  1. logs.SetLogFuncCallDepth(3)

异步输出日志

为了提升性能, 可以设置异步输出:

  1. logs.Async()

异步输出允许设置缓冲 chan 的大小

  1. logs.Async(1e3)

自定义日志格式

在一些情况下,我们可能需要自己定义自己的日志格式规范。这种时候,可以考虑通过扩展LogFormatter

  1. type LogFormatter interface {
  2. Format(lm *LogMsg) string
  3. }

LogMsg包含了一条日志的所有部分。需要注意的是,如果你希望输出文件名和行号,那么应该参考输出文件名和行号,设置对应的参数。

例子:PatternLogFormatter

该实现的设计思路,是希望能够使用类似于占位符的东西来定义一条日志应该如何输出。

例子:

  1. package main
  2. import (
  3. "github.com/beego/beego/v2/core/logs"
  4. )
  5. func main() {
  6. f := &logs.PatternLogFormatter{
  7. Pattern: "%F:%n|%w%t>> %m",
  8. WhenFormat: "2006-01-02",
  9. }
  10. logs.RegisterFormatter("pattern", f)
  11. _ = logs.SetGlobalFormatter("pattern")
  12. logs.Info("hello, world")
  13. }

我们先初始化了一个PatternLogFormatter实例,而后注册为pattern

再然后我们使用logs.SetGlobalFormatter("pattern")设置全局所有的引擎都使用这个格式。

最终我们输出日志/beego-example/logger/formatter/pattern/main.go:31|2020-10-29[I]>> hello, world

如果我们只希望在某个特定的引擎上使用这个格式,我们可以通过初始化引擎的时候,设置:

  1. _ = logs.SetLogger("console",`{"formatter": "pattern"}`)

PatternLogFormatter支持的占位符及其含义:

  • ‘w’ 时间
  • ‘m’ 消息
  • ‘f’ 文件名
  • ‘F’ 文件全路径
  • ‘n’ 行数
  • ‘l’ 消息级别,数字表示
  • ‘t’ 消息级别,简写,例如[I]代表 INFO
  • ‘T’ 消息级别,全称

引擎配置设置

  • console: 命令行输出,默认输出到os.Stdout

    1. logs.SetLogger(logs.AdapterConsole, `{"level":1,"color":true}`)
  1. 主要的参数如下说明:
  2. * level 输出的日志级别
  3. * color 是否开启打印日志彩色打印(需环境支持彩色输出)
  • file:输出到文件,设置的例子如下所示:

    1. logs.SetLogger(logs.AdapterFile, `{"filename":"test.log"}`)
  1. 主要的参数如下说明:
  2. * `filename` 保存的文件名
  3. * `maxlines` 每个文件保存的最大行数,默认值 1000000
  4. * `maxsize` 每个文件保存的最大尺寸,默认值是 1 << 28, 256 MB
  5. * `daily` 是否按照每天 `logrotate`,默认是 `true`
  6. * `maxdays` 文件最多保存多少天,默认保存 7
  7. * `rotate` 是否开启 `logrotate`,默认是 `true`
  8. * `level` 日志保存的时候的级别,默认是 `Trace` 级别
  9. * `perm` 日志文件权限
  • multifile:不同级别的日志会输出到不同的文件中:

    设置的例子如下所示:

    1. logs.SetLogger(logs.AdapterMultiFile, `{"filename":"test.log","separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]}`)
  1. 主要的参数如下说明(除 `separate` 外,均与 file 相同):
  2. * `filename` 保存的文件名
  3. * `maxlines` 每个文件保存的最大行数,默认值 1000000
  4. * `maxsize` 每个文件保存的最大尺寸,默认值是 1 << 28, //256 MB
  5. * `daily` 是否按照每天 logrotate,默认是 true
  6. * `maxdays` 文件最多保存多少天,默认保存 7
  7. * `rotate` 是否开启 logrotate,默认是 true
  8. * `level` 日志保存的时候的级别,默认是 Trace 级别
  9. * `perm` 日志文件权限
  10. * `separate` 需要单独写入文件的日志级别,设置后命名类似 test.error.log
  • conn: 网络输出,设置的例子如下所示:

    1. logs.SetLogger(logs.AdapterConn, `{"net":"tcp","addr":":7020"}`)
  1. 主要的参数说明如下:
  2. * reconnectOnMsg 是否每次链接都重新打开链接,默认是 false
  3. * reconnect 是否自动重新链接地址,默认是 false
  4. * net 发开网络链接的方式,可以使用 tcpunixudp
  5. * addr 网络链接的地址
  6. * level 日志保存的时候的级别,默认是 Trace 级别
  • smtp: 邮件发送,设置的例子如下所示:

    1. logs.SetLogger(logs.AdapterMail, `{"username":"beegotest@gmail.com","password":"xxxxxxxx","host":"smtp.gmail.com:587","sendTos":["xiemengjun@gmail.com"]}`)
  1. 主要的参数说明如下:
  2. * `username`: `smtp` 验证的用户名
  3. * `password`: `smtp` 验证密码
  4. * `host`: 发送的邮箱地址
  5. * `sendTos`: 邮件需要发送的人,支持多个
  6. * `subject`: 发送邮件的标题,默认是 `Diagnostic message from server`
  7. * `level`: 日志发送的级别,默认是 Trace 级别
  • ElasticSearch:输出到 ElasticSearch:

    1. logs.SetLogger(logs.AdapterEs, `{"dsn":"http://localhost:9200/","level":1}`)
  • 简聊: 输出到简聊:

    1. logs.SetLogger(logs.AdapterJianLiao, `{"authorname":"xxx","title":"beego", "webhookurl":"https://jianliao.com/xxx", "redirecturl":"https://jianliao.com/xxx","imageurl":"https://jianliao.com/xxx","level":1}`)
  • slack: 输出到 slack

    1. logs.SetLogger(logs.AdapterSlack, `{"webhookurl":"https://slack.com/xxx","level":1}`)