56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
package commonlog
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"strconv"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// Instances a Logger middleware that will write the logs to gin.DefaultWriter
|
|
// By default gin.DefaultWriter = os.Stdout
|
|
func New() gin.HandlerFunc {
|
|
return NewWithWriter(gin.DefaultWriter)
|
|
}
|
|
|
|
// Instance a Logger middleware with the specified writter buffer.
|
|
// Example: os.Stdout, a file opened in write mode, a socket...
|
|
func NewWithWriter(out io.Writer) gin.HandlerFunc {
|
|
pool := &sync.Pool{
|
|
New: func() interface{} {
|
|
buf := new(bytes.Buffer)
|
|
return buf
|
|
},
|
|
}
|
|
return func(c *gin.Context) {
|
|
path := c.Request.URL.Path
|
|
|
|
// Process request
|
|
c.Next()
|
|
|
|
//127.0.0.1 user-identifier frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
|
|
w := pool.Get().(*bytes.Buffer)
|
|
w.Reset()
|
|
w.WriteString(c.ClientIP())
|
|
w.WriteString(" ")
|
|
w.WriteString(time.Now().Format("[02/Jan/2006:15:04:05 -0700] "))
|
|
w.WriteString("\"")
|
|
w.WriteString(c.Request.Method)
|
|
w.WriteString(" ")
|
|
w.WriteString(path)
|
|
w.WriteString(" ")
|
|
w.WriteString(c.Request.Proto)
|
|
w.WriteString("\" ")
|
|
w.WriteString(strconv.Itoa(c.Writer.Status()))
|
|
w.WriteString(" ")
|
|
w.WriteString(strconv.Itoa(c.Writer.Size()))
|
|
w.WriteString("\n")
|
|
|
|
w.WriteTo(out)
|
|
pool.Put(w)
|
|
}
|
|
}
|