Browse Source

Basic request loger

Vova Tkach 6 years ago
parent
commit
c3aef2ce68
4 changed files with 83 additions and 1 deletions
  1. 36 0
      logger/handler.go
  2. 13 0
      logger/logger.go
  3. 32 0
      logger/writer.go
  4. 2 1
      main.go

+ 36 - 0
logger/handler.go

@@ -0,0 +1,36 @@
+package logger
+
+import (
+	"fmt"
+	"io"
+	"net/http"
+	"os"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type handler struct {
+	h http.Handler
+	w io.Writer
+}
+
+func (this handler) logRequest(w *writer, r *http.Request) {
+	fmt.Fprintln(os.Stdout, strings.Join([]string{
+		r.Host,
+		r.RemoteAddr,
+		"-",
+		"[" + w.s.Format(time.RFC3339) + "]",
+		`"` + r.Method,
+		r.RequestURI,
+		r.Proto + `"`,
+		strconv.Itoa(w.status),
+		strconv.Itoa(w.size),
+	}, " "))
+}
+
+func (this handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	wrt := &writer{w: w, s: time.Now()}
+	this.h.ServeHTTP(wrt, r)
+	this.logRequest(wrt, r)
+}

+ 13 - 0
logger/logger.go

@@ -0,0 +1,13 @@
+package logger
+
+import (
+	"net/http"
+	"os"
+)
+
+func New(h http.Handler) http.Handler {
+	return handler{
+		h: h,
+		w: os.Stdout,
+	}
+}

+ 32 - 0
logger/writer.go

@@ -0,0 +1,32 @@
+package logger
+
+import (
+	"net/http"
+	"time"
+)
+
+type writer struct {
+	w http.ResponseWriter
+	s time.Time
+
+	status int
+	size   int
+}
+
+func (this *writer) Header() http.Header {
+	return this.w.Header()
+}
+
+func (this *writer) Write(bytes []byte) (int, error) {
+	if this.status == 0 {
+		this.status = http.StatusOK
+	}
+	size, err := this.w.Write(bytes)
+	this.size += size
+	return size, err
+}
+
+func (this *writer) WriteHeader(status int) {
+	this.status = status
+	this.w.WriteHeader(status)
+}

+ 2 - 1
main.go

@@ -10,6 +10,7 @@ import (
 	"golang-fave/assets"
 	"golang-fave/consts"
 	"golang-fave/engine"
+	"golang-fave/logger"
 	"golang-fave/utils"
 
 	"github.com/vladimirok5959/golang-server-bootstrap/bootstrap"
@@ -51,7 +52,7 @@ func main() {
 	stat := static.New(consts.DirIndexFile)
 
 	// Init and start web server
-	bootstrap.Start(nil, fmt.Sprintf("%s:%d", ParamHost, ParamPort), 30, consts.AssetsPath, func(w http.ResponseWriter, r *http.Request) {
+	bootstrap.Start(logger.New, fmt.Sprintf("%s:%d", ParamHost, ParamPort), 30, consts.AssetsPath, func(w http.ResponseWriter, r *http.Request) {
 		w.Header().Set("Server", "fave.pro/"+consts.ServerVersion)
 	}, func(w http.ResponseWriter, r *http.Request) {
 		// Mounted assets