本章介绍iris内置的日志配置。
提示:实际项目,可以引入第三方更合适的日志库记录业务日志。
应用程序文件记录器
func main() {
app := iris.Default()
// 记录到文件中
// 当写入文件时,自动禁用颜色
f, _ := os.Create("iris.log")
app.Logger().SetOutput(f)
// 如果需要同时将日志写入文件和控制台,请使用以下代码
// app.Logger().AddOutput(os.Stdout)
app.Get("/ping", func(ctx iris.Context) {
ctx.WriteString("pong")
})
app.Listen(":8080")
}
控制日志输出颜色
默认情况下,控制台上的日志输出将根据检测到的TTY进行彩色化。
在常规的情况下自定义级别标题、文本、颜色和样式。
导入 golog
和 pio
:
import (
"github.com/kataras/golog"
"github.com/kataras/pio"
// [...]
)
获得一个要自定义的级别,比如 DebugLevel
:
level := golog.Levels[golog.DebugLevel]
您可以完全控制级别的文本、标题和样式:
// 级别的名称
// 将使用具名(小写)的名称
// 来将字符串级别转换为正确的级别类型
Name string
// AlternativeNames 是此特定日志级别可以引用的名称。
// 比如 Name = "warn"
// AlternativeNames = []string{"warning"},这是一个可选字段,
// 因此我们将 Name 保持为一个简单的字符串并创建了这个新字段。
AlternativeNames []string
// 标题是日志级别的前缀。
// 还有 `ColorCode` 和 `Style`。
// `ColorCode` 和 `Style` 在写入器之间应该是一致的。
Title string
// ColorCode 用于 `Title` 的颜色。
ColorCode int
// Style 用于 `Title` 的一个或多个丰富选项。
Style []pio.RichOption
示例代码:
level := golog.Levels[golog.DebugLevel]
level.Name = "debug" // 默认
level.Title = "[DBUG]" // 默认
level.ColorCode = pio.Yellow // 默认
更改输出格式:
app.Logger().SetFormat("json", " ")
注册自定义格式化程序:
app.Logger().RegisterFormatter(new(myFormatter))
golog.Formatter 接口 如下所示:
// Formatter 负责将日志打印到记录器的写入器中。
type Formatter interface {
// 格式化程序的名称。
String() string
// 设置任何选项并返回克隆对象,
// 通用的。参见 `Logger.SetFormat`。
Options(opts ...interface{}) Formatter
// 将 "log" 写入到 "dest" 记录器中。
Format(dest io.Writer, log *Log) bool
}
按级别更改输出和格式:
app.Logger().SetLevelOutput("error", os.Stderr)
app.Logger().SetLevelFormat("json")
请求日志记录
我们上面看到的应用程序记录器主要用于记录与应用程序相关的信息和错误。另一方面,下面我们看到的访问日志记录器主要用于记录传入的 HTTP 请求和响应。
package main
import (
"os"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/middleware/accesslog"
)
// 仔细阅读示例及其注释。
func makeAccessLog() *accesslog.AccessLog {
// 初始化一个新的访问日志中间件。
ac := accesslog.File("./access.log")
// 删除此行以禁用日志记录到控制台:
ac.AddOutput(os.Stdout)
// 默认配置:
ac.Delim = '|'
ac.TimeFormat = "2006-01-02 15:04:05"
ac.Async = false
ac.IP = true
ac.BytesReceivedBody = true
ac.BytesSentBody = true
ac.BytesReceived = false
ac.BytesSent = false
ac.BodyMinify = true
ac.RequestBody = true
ac.ResponseBody = false
ac.KeepMultiLineError = true
ac.PanicLog = accesslog.LogHandler
// 如果格式化程序缺失,则使用默认行格式:
// 时间|延迟|状态码|方法|路径|IP|路径参数查询字段|接收的字节数|发送的字节数|请求|响应|
//
// 设置自定义格式化程序:
ac.SetFormatter(&accesslog.JSON{
Indent: " ",
HumanTime: true,
})
// ac.SetFormatter(&accesslog.CSV{})
// ac.SetFormatter(&accesslog.Template{Text: "{{.Code}}"})
return ac
}
func main() {
ac := makeAccessLog()
defer ac.Close() // 关闭文件。
app := iris.New()
// 注册中间件(使用 UseRouter 还可以捕获 HTTP 错误)。
app.UseRouter(ac.Handler)
app.Get("/", indexHandler)
app.Listen(":8080")
}
func indexHandler(ctx iris.Context) {
ctx.WriteString("OK")
}
在这里阅读更多示例:_examples/logging/request-logger。