// Copyright 2014 Manu Martinez-Almeida. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file. package gin import ( "fmt" "io" "time" ) var ( green = string([]byte{27, 91, 57, 55, 59, 52, 50, 109}) white = string([]byte{27, 91, 57, 48, 59, 52, 55, 109}) yellow = string([]byte{27, 91, 57, 55, 59, 52, 51, 109}) red = string([]byte{27, 91, 57, 55, 59, 52, 49, 109}) blue = string([]byte{27, 91, 57, 55, 59, 52, 52, 109}) magenta = string([]byte{27, 91, 57, 55, 59, 52, 53, 109}) cyan = string([]byte{27, 91, 57, 55, 59, 52, 54, 109}) reset = string([]byte{27, 91, 48, 109}) ) func ErrorLogger() HandlerFunc { return ErrorLoggerT(ErrorTypeAll) } func ErrorLoggerT(typ uint32) HandlerFunc { return func(c *Context) { c.Next() if !c.Writer.Written() { errs := c.Errors.ByType(typ) if len(errs) > 0 { c.JSON(-1, c.Errors) } } } } func Logger() HandlerFunc { return LoggerWithFile(DefaultWriter) } func LoggerWithFile(out io.Writer) HandlerFunc { return func(c *Context) { // Start timer start := time.Now() // Process request c.Next() // Stop timer end := time.Now() latency := end.Sub(start) clientIP := c.ClientIP() method := c.Request.Method statusCode := c.Writer.Status() statusColor := colorForStatus(statusCode) methodColor := colorForMethod(method) comment := c.Errors.String() fmt.Fprintf(out, "[GIN] %v |%s %3d %s| %12v | %s |%s %s %-7s %s\n%s", end.Format("2006/01/02 - 15:04:05"), statusColor, statusCode, reset, latency, clientIP, methodColor, reset, method, c.Request.URL.Path, comment, ) } } func colorForStatus(code int) string { switch { case code >= 200 && code <= 299: return green case code >= 300 && code <= 399: return white case code >= 400 && code <= 499: return yellow default: return red } } func colorForMethod(method string) string { switch { case method == "GET": return blue case method == "POST": return cyan case method == "PUT": return yellow case method == "DELETE": return red case method == "PATCH": return green case method == "HEAD": return magenta case method == "OPTIONS": return white default: return reset } }