乐趣区

关于go:Go框架gin中日志文字的颜色是如何实现的

大家好,我是渔夫子。

当咱们在终端上(比方 Goland)运行 gin 框架搭建的服务时,会发现输入的日志是能够带色彩的。比方下图中的最初一行,就是申请一个办法时的输入日志:

咱们看到状态码 200 和申请的办法 GET 都带有不同色彩的背景。那么,这种带色彩的日志是如何实现的呢?

一、gin 中管制日志色彩

首先,在 gin 框架中提供了管制日志文字是否带色彩输入的办法:DisableConsoleColorForceConsoleColor。调用办法如下:

package main

import (
    "github.com/gin-gonic/gin"
    "log"
    "net/http"
)

func main() {r := gin.Default()

    r.GET("/", func(c *gin.Context) {names := []string{"Hello", "World", ""}

        c.SecureJSON(http.StatusOK, names)

    })

  // 调用该函数,则禁用日志带色彩输入
    gin.DisableConsoleColor()
  
  // 应用该函数,则强制日志带色彩输入,无论是在终端还是其余输出设备 
    gin.ForceConsoleColor()

    r.Run("127.0.0.1:8080")
}

这里要留神的就是,如果这两个函数都不调用,那么默认是在终端中输入日志是带色彩的,输入到其余中央是不带色彩的。

如下,咱们将 gin 的日志输入到文件中,并别离查看应用 gin.ForceConsoleColor 函数和不应用 gin.ForceConsoleColor 的日志区别。

那么,当咱们应用tail -n 10 log2.out,在终端上显示该文件的内容时,第一行就会按色彩显示,第二行就没有色彩。如下:

二、终端输入文字色彩是如何实现的?

其实现原理实际上是利用了 ANSI 的 换码符 。所谓换码符就是一套编码规定, 用于管制终端上的光标地位、色彩和其余选项。

在 ascii 码表中,换码符的字符标识是:ESC (escape),其对应的 8 进制、10 进制和 16 进制以及 unicode 码别离如下:

Octal: \033
Decimal: 27
Hexadecimal: \x1B
Unicode: \u001b

在 linux 终端中,色彩的管制应用“\033[”结尾,以 ”m” 结尾的形式设置特定的色彩。比方在 gin 框架中对色彩常量的定义如下:

const (
    green   = "\033[97;42m"
    white   = "\033[90;47m"
    yellow  = "\033[90;43m"
    red     = "\033[97;41m"
    blue    = "\033[97;44m"
    magenta = "\033[97;45m"
    cyan    = "\033[97;46m"
    reset   = "\033[0m")

其中 ";"字符前后的数字别离示意字体的 背景色 前景色(字体色彩)。

在 gin 的框架中,色彩的输入是在函数 defaultLogFormatter 的 fmt.Sprintf 函数将色彩管制码输入到终端上的。如下:

// defaultLogFormatter is the default log format function Logger middleware uses.
var defaultLogFormatter = func(param LogFormatterParams) string {
    var statusColor, methodColor, resetColor string
    if param.IsOutputColor() {statusColor = param.StatusCodeColor()
        methodColor = param.MethodColor()
        resetColor = param.ResetColor()}

    if param.Latency > time.Minute {param.Latency = param.Latency.Truncate(time.Second)
    }
    return fmt.Sprintf("[GIN] %v |%s %3d %s| %13v | %15s |%s %-7s %s %#v\n%s",
        param.TimeStamp.Format("2006/01/02 - 15:04:05"),
        statusColor, param.StatusCode, resetColor,
        param.Latency,
        param.ClientIP,
        methodColor, param.Method, resetColor,
        param.Path,
        param.ErrorMessage,
    )
}

而该函数的利用是在日志中间件中应用的。比方在应用 gin.Default 函数构建 Engine 对象时,就默认给 Engine 帝乡应用了 Logger 中间件。如下:

func Default() *Engine {debugPrintWARNINGDefault()
    engine := New()
    engine.Use(Logger(), Recovery())
    return engine
}

以上就是咱们介绍的在 gin 中如何管制日志输入的色彩性能。如果大家在本人的我的项目中想让终端的输入内容具备更好的色彩管制,举荐一个开源我的项目,其地址地址:https://github.com/fatih/color

特地举荐:一个专一 go 我的项目实战、我的项目中踩坑教训及避坑指南、各种好玩的 go 工具的公众号,「Go 学堂」,专一实用性,十分值得大家关注。点击下方公众号卡片,间接关注。关注送《100 个 go 常见的谬误》pdf 文档。

退出移动版