123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- package negroni
- import (
- "bytes"
- "log"
- "net/http"
- "os"
- "text/template"
- "time"
- )
- // LoggerEntry is the structure passed to the template.
- type LoggerEntry struct {
- StartTime string
- Status int
- Duration time.Duration
- Hostname string
- Method string
- Path string
- Request *http.Request
- }
- // LoggerDefaultFormat is the format logged used by the default Logger instance.
- var LoggerDefaultFormat = "{{.StartTime}} | {{.Status}} | \t {{.Duration}} | {{.Hostname}} | {{.Method}} {{.Path}}"
- // LoggerDefaultDateFormat is the format used for date by the default Logger instance.
- var LoggerDefaultDateFormat = time.RFC3339
- // ALogger interface
- type ALogger interface {
- Println(v ...interface{})
- Printf(format string, v ...interface{})
- }
- // Logger is a middleware handler that logs the request as it goes in and the response as it goes out.
- type Logger struct {
- // ALogger implements just enough log.Logger interface to be compatible with other implementations
- ALogger
- dateFormat string
- template *template.Template
- }
- // NewLogger returns a new Logger instance
- func NewLogger() *Logger {
- logger := &Logger{ALogger: log.New(os.Stdout, "[negroni] ", 0), dateFormat: LoggerDefaultDateFormat}
- logger.SetFormat(LoggerDefaultFormat)
- return logger
- }
- func (l *Logger) SetFormat(format string) {
- l.template = template.Must(template.New("negroni_parser").Parse(format))
- }
- func (l *Logger) SetDateFormat(format string) {
- l.dateFormat = format
- }
- func (l *Logger) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
- start := time.Now()
- next(rw, r)
- res := rw.(ResponseWriter)
- log := LoggerEntry{
- StartTime: start.Format(l.dateFormat),
- Status: res.Status(),
- Duration: time.Since(start),
- Hostname: r.Host,
- Method: r.Method,
- Path: r.URL.Path,
- Request: r,
- }
- buff := &bytes.Buffer{}
- l.template.Execute(buff, log)
- l.Println(buff.String())
- }
|