Skip to content
[MODULE] - Fast and cheap HTTP access logger middleware for Go crafted with special care in order to ensure marginal heap memory footprint and low garbage collector pressure.
Go Makefile
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore - Sep 24, 2019
.travis.yml
LICENSE
Makefile - Sep 24, 2019
README.md - Sep 24, 2019
go.mod
logger.go - Sep 24, 2019
logger_test.go - Sep 24, 2019

README.md

Build Status Coverage Status

midas

Fast and cheap HTTP access logger middleware for Go.

Installation

go get -u github.com/dtgorski/midas

midas.Logger

... is a fast HTTP middleware for machine-readable response logging (access.log). Special care has been taken in order to ensure marginal heap memory footprint and low garbage collector pressure. The customized output layout has been chosen due to a specific requirement. If you need a different layout, feel free to fork.

Usage with a common router software:

import "github.com/dtgorski/midas"
.
.
router.Use(
    midas.Logger(os.Stdout),
    .
    .
)

Usage with handcrafted routing:

package main

import (
    "io"
    "log"
    "net/http"
    "os"

    "github.com/dtgorski/midas"
)

func main() {
    handler := http.HandlerFunc(
        func(w http.ResponseWriter, req *http.Request) {
            io.WriteString(w, "Hello, world!\n")
        },
    )
    logger := midas.Logger(os.Stdout)
    http.Handle("/", logger(handler))

    log.Fatal(http.ListenAndServe(":8080", nil))
}

Log output could look like:

0000-00-00T00:00:00+00:00 | 127.0.0.1 | - | GET /hello HTTP/1.1 | 200 | - | - | Mozilla/5.0 (X11; Linux… | - | - | 14 | 0.000 | -
0000-00-00T00:00:00+00:00 | 127.0.0.1 | - | GET / HTTP/1.1 | 200 | - | - | Mozilla/5.0 (X11; Linux… | - | - | 14 | 0.000 | -
0000-00-00T00:00:00+00:00 | 127.0.0.1 | - | GET / HTTP/1.1 | 200 | - | - | Mozilla/5.0 (X11; Linux… | - | - | 14 | 0.000 | -

A log line consists of fields separated by a pipe and is suffixed by a newline (\n). Non-printable whitespace characters and UTF-8 runes will be replaced by a period sign (.). The fields in their order:

  • access time
  • remote address without port
  • remote user, if any
  • request method, path, protocol
  • response status code
  • referer, if any
  • forwarded for, if any
  • user agent, if any
  • SSL protocol, if any
  • SSL cipher, if any
  • bytes sent in response
  • request time in seconds, three fractional digits
  • request id, if any

Although targeted for machine-reading (like log aggregators), the field values are padded with spaces for better human perception.

Artificial benchmark:

$ make bench 
CGO_ENABLED=0 go test -run=^$ -bench=. -benchmem
goos: linux
goarch: amd64
pkg: github.com/dtgorski/midas

BenchmarkLoggerConcatFullLine-8   2000000   850 ns/op   48 B/op   2 allocs/op

License

MIT - © dtg [at] lengo [dot] org

You can’t perform that action at this time.