2016-05-30 16:08:09 +02:00
|
|
|
package logger
|
|
|
|
|
|
|
|
import (
|
2016-05-31 10:05:42 +02:00
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
|
2016-05-30 16:08:09 +02:00
|
|
|
"github.com/kataras/iris"
|
|
|
|
"github.com/kataras/iris/config"
|
|
|
|
"github.com/kataras/iris/logger"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Options are the options of the logger middlweare
|
|
|
|
// contains 5 bools
|
|
|
|
// Latency, Status, IP, Method, Path
|
|
|
|
// if set to true then these will print
|
|
|
|
type Options struct {
|
2016-05-31 10:05:42 +02:00
|
|
|
// Latency displays latency (bool)
|
2016-05-30 16:08:09 +02:00
|
|
|
Latency bool
|
2016-05-31 10:05:42 +02:00
|
|
|
// Status displays status code (bool)
|
|
|
|
Status bool
|
|
|
|
// IP displays request's remote address (bool)
|
|
|
|
IP bool
|
|
|
|
// Method displays the http method (bool)
|
|
|
|
Method bool
|
|
|
|
// Path displays the request path (bool)
|
|
|
|
Path bool
|
2016-05-30 16:08:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// DefaultOptions returns an options which all properties are true
|
|
|
|
func DefaultOptions() Options {
|
|
|
|
return Options{true, true, true, true, true}
|
|
|
|
}
|
|
|
|
|
|
|
|
type loggerMiddleware struct {
|
|
|
|
*logger.Logger
|
|
|
|
options Options
|
|
|
|
}
|
|
|
|
|
2016-05-31 10:05:42 +02:00
|
|
|
// Serve serves the middleware
|
2016-05-30 16:08:09 +02:00
|
|
|
func (l *loggerMiddleware) Serve(ctx *iris.Context) {
|
|
|
|
//all except latency to string
|
|
|
|
var date, status, ip, method, path string
|
|
|
|
var latency time.Duration
|
|
|
|
var startTime, endTime time.Time
|
|
|
|
path = ctx.PathString()
|
|
|
|
method = ctx.MethodString()
|
|
|
|
|
|
|
|
if l.options.Latency {
|
|
|
|
startTime = time.Now()
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.Next()
|
|
|
|
if l.options.Latency {
|
|
|
|
//no time.Since in order to format it well after
|
|
|
|
endTime = time.Now()
|
|
|
|
date = endTime.Format("01/02 - 15:04:05")
|
|
|
|
latency = endTime.Sub(startTime)
|
|
|
|
}
|
|
|
|
|
|
|
|
if l.options.Status {
|
|
|
|
status = strconv.Itoa(ctx.Response.StatusCode())
|
|
|
|
}
|
|
|
|
|
|
|
|
if l.options.IP {
|
|
|
|
ip = ctx.RemoteAddr()
|
|
|
|
}
|
|
|
|
|
|
|
|
if !l.options.Method {
|
|
|
|
method = ""
|
|
|
|
}
|
|
|
|
|
|
|
|
if !l.options.Path {
|
|
|
|
path = ""
|
|
|
|
}
|
|
|
|
|
|
|
|
//finally print the logs
|
|
|
|
if l.options.Latency {
|
2016-06-06 20:04:38 +02:00
|
|
|
l.Infof("%s %v %4v %s %s %s \n", date, status, latency, ip, method, path)
|
2016-05-30 16:08:09 +02:00
|
|
|
} else {
|
2016-06-06 20:04:38 +02:00
|
|
|
l.Infof("%s %v %s %s %s \n", date, status, ip, method, path)
|
2016-05-30 16:08:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-06-06 20:04:38 +02:00
|
|
|
// Default returns the logger middleware as Handler with the default settings
|
|
|
|
func New(theLogger *logger.Logger, options ...Options) iris.HandlerFunc {
|
|
|
|
if theLogger == nil {
|
|
|
|
theLogger = logger.New(config.DefaultLogger())
|
|
|
|
}
|
2016-05-30 16:08:09 +02:00
|
|
|
|
2016-06-06 20:04:38 +02:00
|
|
|
l := &loggerMiddleware{Logger: theLogger}
|
2016-05-30 16:08:09 +02:00
|
|
|
|
|
|
|
if len(options) > 0 {
|
|
|
|
l.options = options[0]
|
|
|
|
} else {
|
|
|
|
l.options = DefaultOptions()
|
|
|
|
}
|
|
|
|
|
2016-06-06 20:04:38 +02:00
|
|
|
return l.Serve
|
2016-05-30 16:08:09 +02:00
|
|
|
}
|