coller/src/cmd/collerd/main.go
Julien Riou 2d8d7efbcb
All checks were successful
/ pre-commit (push) Successful in 1m17s
feat: Add JSON logging format
Fixes #40.

Signed-off-by: Julien Riou <julien@riou.xyz>
2025-10-02 07:35:48 +02:00

101 lines
2.3 KiB
Go

package main
import (
"flag"
"log/slog"
"os"
"github.com/prometheus/client_golang/prometheus"
"git.riou.xyz/jriou/coller/internal"
"git.riou.xyz/jriou/coller/server"
)
var (
AppName = "collerd"
AppVersion string
GoVersion string
GitCommit string
)
func handleMain() int {
var err error
config := server.NewConfig()
version := flag.Bool("version", false, "Print version and exit")
quiet := flag.Bool("quiet", false, "Log errors only")
verbose := flag.Bool("verbose", false, "Print more logs")
debug := flag.Bool("debug", false, "Print even more logs")
jsonFormat := flag.Bool("json", false, "Print logs in JSON format")
configFileName := flag.String("config", "", "Configuration file name")
flag.Parse()
if *version {
internal.ShowVersion(AppName, AppVersion, GitCommit, GoVersion)
return internal.RC_OK
}
var level slog.Level
if *debug {
level = slog.LevelDebug
}
if *verbose {
level = slog.LevelInfo
}
if *quiet {
level = slog.LevelError
}
var logger *slog.Logger
if *jsonFormat {
logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
} else {
logger = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
}
if *configFileName != "" {
err = internal.ReadConfig(*configFileName, config)
if err != nil {
return internal.ReturnError(logger, "could not parse configuration file", err)
}
logger.Debug("configuration file parsed", slog.Any("file", *configFileName))
}
if err = config.Check(); err != nil {
return internal.ReturnError(logger, "invalid configuration", err)
}
db, err := server.NewDatabase(logger, config)
if err != nil {
return internal.ReturnError(logger, "could not connect to the database", err)
}
srv, err := server.NewServer(logger, db, config, AppVersion)
if err != nil {
return internal.ReturnError(logger, "could not create server", err)
}
srv.SetEncryptionKeyLength(config.EncryptionKeyLength)
if config.EnableMetrics {
reg := prometheus.NewRegistry()
metrics, err := server.NewMetrics(logger, reg, config, db)
if err != nil {
return internal.ReturnError(logger, "could not register metrics", err)
}
srv.SetMetrics(metrics)
}
err = srv.Start()
if err != nil {
return internal.ReturnError(logger, "could not start server", err)
}
return internal.RC_OK
}
func main() {
os.Exit(handleMain())
}