Structured Logging

logging json

By using a custom logger all the request could be written in a structured format that can be easily parsed.

Example using JSON format:

package main

import (


func helloWorld(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hello world!"))

func myLogger(w *violetear.ResponseWriter, r *http.Request) {
    j := map[string]interface{}{
        "Time":        time.Now().UTC().Format(time.RFC3339),
        "RemoteAddr":  r.RemoteAddr,
        "URL":         r.URL.String(),
        "Status":      w.Status(),
        "Size":        w.Size(),
        "RequestTime": w.RequestTime(),
        "RequestID":   w.RequestID(),
    if err := json.NewEncoder(os.Stdout).Encode(j); err != nil {

func main() {
    router := violetear.New()
    router.LogRequests = true
    router.Logger = myLogger
    router.Verbose = false
    router.HandleFunc("*", helloWorld)
    log.Fatal(http.ListenAndServe(":8080", router))

Notice the:

router.Logger = myLogger

In this example all requests are going to print out to stdout similar to this:

    "RemoteAddr": "",
    "RequestID": "",
    "RequestTime": "15.876µs",
    "Size": 12,
    "Status": 200,
    "Time": "2017-10-07T08:36:05Z",
    "URL": "/"

The myLogger function:

func myLogger(w *violetear.ResponseWriter, r *http.Request) {}

Is using violetear’s Responsewriter, which contains the following methods:

  • Status() the returned HTTP status code
  • Size() bytes written
  • RequestTime() the time it took the router to dispatch the request
  • RequestID() the incoming request-id in case defined
comments powered by Disqus