logger

package module
v1.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 23, 2024 License: MIT Imports: 8 Imported by: 136

README

logger

Run Tests codecov Go Report Card GoDoc

Gin middleware/handler to logger url path using rs/zerolog.

Example

package main

import (
  "fmt"
  "net/http"
  "regexp"
  "time"

  "github.com/gin-contrib/logger"
  "github.com/gin-contrib/requestid"
  "github.com/gin-gonic/gin"
  "github.com/rs/zerolog"
  "github.com/rs/zerolog/log"
)

var rxURL = regexp.MustCompile(`^/regexp\d*`)

func main() {
  r := gin.New()

  // Add a logger middleware, which:
  //   - Logs all requests, like a combined access and error log.
  //   - Logs to stdout.
  // r.Use(logger.SetLogger())

  // Example pong request.
  r.GET("/pong", logger.SetLogger(), func(c *gin.Context) {
    c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
  })

  // Example ping request.
  r.GET("/ping", logger.SetLogger(
    logger.WithSkipPath([]string{"/skip"}),
    logger.WithUTC(true),
    logger.WithSkipPathRegexps(rxURL),
  ), func(c *gin.Context) {
    c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
  })

  // Example skip path request.
  r.GET("/skip", logger.SetLogger(
    logger.WithSkipPath([]string{"/skip"}),
  ), func(c *gin.Context) {
    c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
  })

  // Example skip path request.
  r.GET("/regexp1", logger.SetLogger(
    logger.WithSkipPathRegexps(rxURL),
  ), func(c *gin.Context) {
    c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
  })

  // Example skip path request.
  r.GET("/regexp2", logger.SetLogger(
    logger.WithSkipPathRegexps(rxURL),
  ), func(c *gin.Context) {
    c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
  })

  // add custom fields.
  r.GET("/id", requestid.New(requestid.WithGenerator(func() string {
    return "foobar"
  })), logger.SetLogger(
    logger.WithLogger(func(c *gin.Context, l zerolog.Logger) zerolog.Logger {
      if trace.SpanFromContext(c.Request.Context()).SpanContext().IsValid() {
        l = l.With().
          Str("trace_id", trace.SpanFromContext(c.Request.Context()).SpanContext().TraceID().String()).
          Str("span_id", trace.SpanFromContext(c.Request.Context()).SpanContext().SpanID().String()).
          Logger()
      }

      return l.With().
        Str("id", requestid.Get(c)).
        Str("foo", "bar").
        Str("path", c.Request.URL.Path).
        Logger()
    }),
  ), func(c *gin.Context) {
    c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
  })

  // Example of JSON format log
  r.GET("/json", logger.SetLogger(
    logger.WithLogger(func(_ *gin.Context, l zerolog.Logger) zerolog.Logger {
      return l.Output(gin.DefaultWriter).With().Logger()
    }),
  ), func(c *gin.Context) {
    c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
  })

  // Example of skipper usage
  r.GET("/health", logger.SetLogger(
    logger.WithSkipper(func(c *gin.Context) bool {
      return c.Request.URL.Path == "/health"
    }),
  ), func(c *gin.Context) {
    c.String(http.StatusOK, "pong "+fmt.Sprint(time.Now().Unix()))
  })

  // Listen and Server in 0.0.0.0:8080
  if err := r.Run(":8080"); err != nil {
    log.Fatal().Msg("can' start server with 8080 port")
  }
}

Screenshot

Run app server:

go run _example/main.go

Test request:

curl http://localhost:8080/ping
curl http://localhost:8080/pong
curl http://localhost:8080/json

screenshot

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ParseLevel added in v0.2.6

func ParseLevel(levelStr string) (zerolog.Level, error)

ParseLevel converts a level string into a zerolog Level value. returns an error if the input string does not match known values.

func SetLogger

func SetLogger(opts ...Option) gin.HandlerFunc

SetLogger initializes the logging middleware.

Types

type Fn added in v0.2.4

type Option added in v0.1.0

type Option interface {
	// contains filtered or unexported methods
}

Option specifies instrumentation configuration options.

func WithClientErrorLevel added in v0.2.2

func WithClientErrorLevel(lvl zerolog.Level) Option

WithClientErrorLevel set the log level used for request with status code between 400 and 499

func WithDefaultLevel added in v0.2.2

func WithDefaultLevel(lvl zerolog.Level) Option

WithDefaultLevel set the log level used for request with status code < 400

func WithLogger added in v0.1.0

func WithLogger(fn func(*gin.Context, zerolog.Logger) zerolog.Logger) Option

WithLogger set custom logger func

func WithPathLevel added in v1.0.0

func WithPathLevel(m map[string]zerolog.Level) Option

WithPathLevel use logging level for successful requests to a specific path

func WithServerErrorLevel added in v0.2.2

func WithServerErrorLevel(lvl zerolog.Level) Option

WithServerErrorLevel set the log level used for request with status code >= 500

func WithSkipPath added in v0.1.0

func WithSkipPath(s []string) Option

WithSkipPath skip URL path by specific pattern

func WithSkipPathRegexps added in v0.3.0

func WithSkipPathRegexps(regs ...*regexp.Regexp) Option

WithSkipPathRegexps multiple skip URL paths by regexp pattern

func WithSkipper added in v1.0.0

func WithSkipper(s Skipper) Option

WithSkipper set function to skip middleware requests with this function returning true will not have their logs written Default is nil

func WithUTC added in v0.1.0

func WithUTC(s bool) Option

WithUTC returns t with the location set to UTC.

func WithWriter added in v0.2.0

func WithWriter(s io.Writer) Option

WithWriter change the default output writer. Default is gin.DefaultWriter

type Skipper added in v1.0.0

type Skipper func(c *gin.Context) bool

Skipper is a function to skip logs based on provided Context

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL