Go Iris 实现将请求日志与异常日志按天写入本地文件

Go Iris 是一个非常优秀的web框架,它提供了很强大的扩充功能,而且框架的作者正在打造自己的 Go Iris 的生态,这篇文章用来介绍文件日志的记录。先来看看生成的日志,如图,有两种类型日志,[INFO],[ERRO],其中[INFO]是 Go Iris 的请求日志,类似 nginx 的日志(但是比 nginx 日志多了请求的执行时间),[ERRO]是自己定义的错误日志,生产环境,我们可能仅仅需要记录[ERRO]日志。


下面我们看看 Go Iris 如何实现标准的日志输出,我们这里选择了同时输出到文件和控制台,您也可以配置只生成到文件或者只生成到控制台,只生成到文件做如下修改即可
    app := iris.New()
    // 同时写文件日志与控制台日志
    app.Logger().SetOutput(io.MultiWriter(f, os.Stdout))
    // or 使用下面这个
    // 日志只生成到文件
    app.Logger().SetOutput(f)

下面是可以直接执行的全量代码
package main

import (
    "io"
    "os"
    "time"

    "github.com/kataras/iris"
    "github.com/kataras/iris/middleware/logger"
)

// 按天生成日志文件
func todayFilename() string {
    today := time.Now().Format("20060102")
    return today + ".log"
}

// 创建打开文件
func newLogFile() *os.File {
    filename := todayFilename()
    ferr := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        panic(err)
    }

    return f
}

func main() {
    f := newLogFile()
    defer f.Close()

    app := iris.New()
    // 同时写文件日志与控制台日志
    app.Logger().SetOutput(io.MultiWriter(f, os.Stdout))

    requestLogger := logger.New(logger.Config{
        // Status displays status code
        Status: true,
        // IP displays request's remote address
        IP: true,
        // Method displays the http method
        Method: true,
        // Path displays the request path
        Path: true,
        // Query appends the url query to the Path.
        Query: true,
        // if !empty then its contents derives from `ctx.Values().Get("logger_message")
        // will be added to the logs.
        MessageContextKeys: []string{"logger_message"},
        // if !empty then its contents derives from `ctx.GetHeader("User-Agent")
        MessageHeaderKeys: []string{"User-Agent"},
    })
    app.Use(requestLogger)

    app.Get("/info"func(ctx iris.Context) {
        ctx.Application().Logger().Infof("hello: %s""i am info.")
        ctx.WriteString("write info")
    })

    app.Get("/error"func(ctx iris.Context) {
        ctx.Application().Logger().Errorf("hello: %s""i am error.")
        ctx.WriteString("write error")
    })

    app.Run(
        iris.Addr(":8080"),
        iris.WithoutBanner,
        iris.WithoutServerError(iris.ErrServerClosed),
    )
}


所以将 Go Iris 记录请求日志,以及错误日志非常简单,错误日志的深入,我们将在后面的文章介绍,将记录错误的跟踪,以便修复。Go Iris 也正在打造自己的生态,里面包含很多第三方的包,地址:https://github.com/iris-contrib
Posted by 何敏 on 2020-02-10 10:34:07