86 lines
2.1 KiB
Go
86 lines
2.1 KiB
Go
package logger
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"go_dreamfactory/lego/sys/gin/engine"
|
|
)
|
|
|
|
type LogFormatterParams struct {
|
|
Request *http.Request
|
|
// TimeStamp shows the time after the server returns a response.
|
|
TimeStamp time.Time
|
|
// StatusCode is HTTP response code.
|
|
StatusCode int
|
|
// Latency is how much time the server cost to process a certain request.
|
|
Latency time.Duration
|
|
// ClientIP equals Context's ClientIP method.
|
|
ClientIP string
|
|
// Method is the HTTP method given to the request.
|
|
Method string
|
|
// Path is a path the client requests.
|
|
Path string
|
|
// ErrorMessage is set if error has occurred in processing the request.
|
|
ErrorMessage string
|
|
// isTerm shows whether gin's output descriptor refers to a terminal.
|
|
isTerm bool
|
|
// BodySize is the size of the Response Body
|
|
BodySize int
|
|
// Keys are the keys set on the request's context.
|
|
Keys map[string]interface{}
|
|
}
|
|
|
|
func Logger(SkipPaths []string) engine.HandlerFunc {
|
|
var skip map[string]struct{}
|
|
if length := len(SkipPaths); length > 0 {
|
|
skip = make(map[string]struct{}, length)
|
|
|
|
for _, path := range SkipPaths {
|
|
skip[path] = struct{}{}
|
|
}
|
|
}
|
|
return func(c *engine.Context) {
|
|
// Start timer
|
|
start := time.Now()
|
|
path := c.Request.URL.Path
|
|
raw := c.Request.URL.RawQuery
|
|
|
|
// Process request
|
|
c.Next()
|
|
|
|
// Log only when path is not being skipped
|
|
if _, ok := skip[path]; !ok {
|
|
param := LogFormatterParams{
|
|
Request: c.Request,
|
|
Keys: c.Keys,
|
|
}
|
|
// Stop timer
|
|
param.TimeStamp = time.Now()
|
|
param.Latency = param.TimeStamp.Sub(start)
|
|
|
|
param.ClientIP = c.ClientIP()
|
|
param.Method = c.Request.Method
|
|
param.StatusCode = c.Writer.Status()
|
|
param.ErrorMessage = c.Errors.ByType(engine.ErrorTypePrivate).String()
|
|
|
|
param.BodySize = c.Writer.Size()
|
|
|
|
if raw != "" {
|
|
path = path + "?" + raw
|
|
}
|
|
param.Path = path
|
|
c.Log.Debugf(fmt.Sprintf("[FORMATTER TEST] %v | %3d | %13v | %15s | %-7s %s\n%s",
|
|
param.TimeStamp.Format("2006/01/02 - 15:04:05"),
|
|
param.StatusCode,
|
|
param.Latency,
|
|
param.ClientIP,
|
|
param.Method,
|
|
param.Path,
|
|
param.ErrorMessage,
|
|
))
|
|
}
|
|
}
|
|
}
|