Add config package with build-tag-switched dev/prod environments, structured logging via zerolog, Taskfile for dev workflow, golangci-lint config, testutil package, and improved DB setup with proper SQLite pragmas and cleanup. Rename sqlc output package from gen to repository. Switch to allowlist .gitignore, Alpine+UPX+scratch Dockerfile, and CI pipeline with test/lint gates before deploy.
42 lines
922 B
Go
42 lines
922 B
Go
// Package logging configures zerolog and provides HTTP request logging middleware.
|
|
package logging
|
|
|
|
import (
|
|
"io"
|
|
stdlog "log"
|
|
"os"
|
|
|
|
"github.com/ryanhamamura/c4/config"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
"github.com/rs/zerolog/pkgerrors"
|
|
)
|
|
|
|
func SetupLogger(env config.Environment, level zerolog.Level) *zerolog.Logger {
|
|
zerolog.ErrorStackFieldName = "stack_trace"
|
|
zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
|
|
|
|
zerolog.SetGlobalLevel(level)
|
|
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
|
|
|
|
var output io.Writer
|
|
switch env {
|
|
case config.Dev:
|
|
output = zerolog.ConsoleWriter{
|
|
Out: os.Stderr,
|
|
TimeFormat: "2006/01/02 15:04:05",
|
|
}
|
|
case config.Prod:
|
|
output = os.Stderr
|
|
}
|
|
|
|
logger := zerolog.New(output).With().Timestamp().Stack().Logger()
|
|
zerolog.DefaultContextLogger = &logger
|
|
log.Logger = logger
|
|
|
|
stdlog.SetFlags(0)
|
|
stdlog.SetOutput(logger)
|
|
return &logger
|
|
}
|