大家好,我是渔夫子。

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

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

一、gin中管制日志色彩

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

package mainimport (    "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: \033Decimal: 27Hexadecimal: \x1BUnicode: \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文档。