mirror of
https://github.com/stashapp/stash.git
synced 2025-12-08 01:13:09 +01:00
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package httplog
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
var DefaultOptions = Options{
|
|
LogLevel: "info",
|
|
LevelFieldName: "level",
|
|
JSON: false,
|
|
Concise: false,
|
|
Tags: nil,
|
|
SkipHeaders: nil,
|
|
}
|
|
|
|
type Options struct {
|
|
// LogLevel defines the minimum level of severity that app should log.
|
|
//
|
|
// Must be one of: ["trace", "debug", "info", "warn", "error", "critical"]
|
|
LogLevel string
|
|
|
|
// LevelFieldName sets the field name for the log level or severity.
|
|
// Some providers parse and search for different field names.
|
|
LevelFieldName string
|
|
|
|
// JSON enables structured logging output in json. Make sure to enable this
|
|
// in production mode so log aggregators can receive data in parsable format.
|
|
//
|
|
// In local development mode, its appropriate to set this value to false to
|
|
// receive pretty output and stacktraces to stdout.
|
|
JSON bool
|
|
|
|
// Concise mode includes fewer log details during the request flow. For example
|
|
// exluding details like request content length, user-agent and other details.
|
|
// This is useful if during development your console is too noisy.
|
|
Concise bool
|
|
|
|
// Tags are additional fields included at the root level of all logs.
|
|
// These can be useful for example the commit hash of a build, or an environment
|
|
// name like prod/stg/dev
|
|
Tags map[string]string
|
|
|
|
// SkipHeaders are additional headers which are redacted from the logs
|
|
SkipHeaders []string
|
|
}
|
|
|
|
// Configure will set new global/default options for the httplog and behaviour
|
|
// of underlying zerolog pkg and its global logger.
|
|
func Configure(opts Options) {
|
|
if opts.LogLevel == "" {
|
|
opts.LogLevel = "info"
|
|
}
|
|
|
|
if opts.LevelFieldName == "" {
|
|
opts.LevelFieldName = "level"
|
|
}
|
|
|
|
// Pre-downcase all SkipHeaders
|
|
for i, header := range opts.SkipHeaders {
|
|
opts.SkipHeaders[i] = strings.ToLower(header)
|
|
}
|
|
|
|
DefaultOptions = opts
|
|
|
|
// Config the zerolog global logger
|
|
logLevel, err := zerolog.ParseLevel(strings.ToLower(opts.LogLevel))
|
|
if err != nil {
|
|
fmt.Printf("httplog: error! %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
zerolog.SetGlobalLevel(logLevel)
|
|
|
|
zerolog.LevelFieldName = strings.ToLower(opts.LevelFieldName)
|
|
zerolog.TimestampFieldName = "timestamp"
|
|
zerolog.TimeFieldFormat = time.RFC3339Nano
|
|
|
|
if !opts.JSON {
|
|
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339})
|
|
}
|
|
}
|