mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-21 08:42:16 +08:00
Update: add gin.StyleLogger, and the method functions and unit test codes of it.
This commit is contained in:
parent
fb3a2557cd
commit
6fcddbdc6f
75
logger.go
75
logger.go
@ -269,3 +269,78 @@ func LoggerWithConfig(conf LoggerConfig) HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Logger for output the custom log information with gin style in the gin.HandlerFunc.
|
||||||
|
type StyleLogger struct {
|
||||||
|
// Optional. Default value is gin.defaultGinStyleLogFormatter
|
||||||
|
Formatter LogFormatter
|
||||||
|
|
||||||
|
// Output is a writer where logs are written.
|
||||||
|
// Optional. Default value is gin.DefaultWriter.
|
||||||
|
Output io.Writer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output the log information with custom status code and message.
|
||||||
|
func (p *StyleLogger) Fprintln(c *Context, statusCode int, message string) {
|
||||||
|
path := c.Request.URL.Path
|
||||||
|
raw := c.Request.URL.RawQuery
|
||||||
|
|
||||||
|
isTerm := true
|
||||||
|
|
||||||
|
if w, ok := p.Output.(*os.File); !ok || os.Getenv("TERM") == "dumb" ||
|
||||||
|
(!isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd())) {
|
||||||
|
isTerm = false
|
||||||
|
}
|
||||||
|
|
||||||
|
param := LogFormatterParams{
|
||||||
|
Request: c.Request,
|
||||||
|
isTerm: isTerm,
|
||||||
|
Keys: c.Keys,
|
||||||
|
}
|
||||||
|
param.TimeStamp = time.Now()
|
||||||
|
param.ClientIP = c.ClientIP()
|
||||||
|
param.Method = c.Request.Method
|
||||||
|
param.StatusCode = statusCode
|
||||||
|
param.ErrorMessage = message
|
||||||
|
|
||||||
|
if raw != "" {
|
||||||
|
path = path + "?" + raw
|
||||||
|
}
|
||||||
|
param.Path = path
|
||||||
|
fmt.Fprintln(p.Output, p.Formatter(param))
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultGinStyleLogFormatter is the default log format function gin.StyleLogger uses.
|
||||||
|
var defaultGinStyleLogFormatter = 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 {
|
||||||
|
// Truncate in a golang < 1.8 safe way
|
||||||
|
param.Latency = param.Latency - param.Latency%time.Second
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("[GIN] %v |%s %3d %s| %13v | %15s |%s %-7s %s %s | %s",
|
||||||
|
param.TimeStamp.Format("2006/01/02 - 15:04:05"),
|
||||||
|
statusColor, param.StatusCode, resetColor,
|
||||||
|
"ginStyleLog",
|
||||||
|
param.ClientIP,
|
||||||
|
methodColor, param.Method, resetColor,
|
||||||
|
param.Path,
|
||||||
|
param.ErrorMessage,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// return a StyleLogger instance with the params. when the param is nil, will use the default value.
|
||||||
|
func NewGinStyleLogger(out io.Writer, formatter LogFormatter) *StyleLogger {
|
||||||
|
if out == nil {
|
||||||
|
out = DefaultWriter
|
||||||
|
}
|
||||||
|
if formatter == nil {
|
||||||
|
formatter = defaultGinStyleLogFormatter
|
||||||
|
}
|
||||||
|
return &StyleLogger{Output: out, Formatter: formatter}
|
||||||
|
}
|
||||||
|
@ -432,3 +432,20 @@ func TestForceConsoleColor(t *testing.T) {
|
|||||||
// reset console color mode.
|
// reset console color mode.
|
||||||
consoleColorMode = autoColor
|
consoleColorMode = autoColor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStyleLogger_Fprintln(t *testing.T) {
|
||||||
|
buffer := new(bytes.Buffer)
|
||||||
|
ginStyleLogger := NewGinStyleLogger(buffer, nil)
|
||||||
|
router := New()
|
||||||
|
router.GET("/gin_style_log", func(c *Context) {
|
||||||
|
ginStyleLogger.Fprintln(c, 200, "[gin style log information]")
|
||||||
|
})
|
||||||
|
|
||||||
|
performRequest(router, "GET", "/gin_style_log")
|
||||||
|
|
||||||
|
// output test
|
||||||
|
assert.Contains(t, buffer.String(), "[gin style log information]")
|
||||||
|
assert.Contains(t, buffer.String(), "200")
|
||||||
|
assert.Contains(t, buffer.String(), "/gin_style_log")
|
||||||
|
assert.Contains(t, buffer.String(), "ginStyleLog")
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user