diff --git a/handlerApi.go b/handlerApi.go index b8faac9..5b3d82a 100644 --- a/handlerApi.go +++ b/handlerApi.go @@ -1,7 +1,7 @@ package main import ( - "log" + "log/slog" "net/http" ) @@ -11,8 +11,7 @@ func (s *Server) handlerRefresh(w http.ResponseWriter, req *http.Request) { return } if err := s.c.Refresh(); err != nil { - // #log - log.Printf("refresh failed: %v", err) + slog.Error("refresh failed", "err", err) http.Error(w, "refresh failed", http.StatusInternalServerError) return } diff --git a/handlerPkgs.go b/handlerPkgs.go index bfeb897..2d63e9f 100644 --- a/handlerPkgs.go +++ b/handlerPkgs.go @@ -3,7 +3,7 @@ package main import ( "errors" "io" - "log" + "log/slog" "net/http" "path/filepath" "strconv" @@ -21,8 +21,7 @@ func (s *Server) handlePackage(w http.ResponseWriter, req *http.Request) { } // record the useragent from requestor - // #log level debug - log.Printf("Requestors UA: %s", req.Header.Get("User-Agent")) + slog.Debug("Requestors User Agent", "UA", req.Header.Get("User-Agent")) // build file paths from the request, they follow archlinux repo // /[core, extra, etc]/os/[x86_64, arm, etc]/package.pkg.tar.zst[.sig] @@ -34,13 +33,11 @@ func (s *Server) handlePackage(w http.ResponseWriter, req *http.Request) { cachedFile, err := s.c.Fetch(repoPath) if err != nil { if upstreamErr, ok := errors.AsType[*cache.UpstreamError](err); ok { - // #log level warn - log.Printf("upstream Error: %v", upstreamErr.Error()) + slog.Warn("upstream error", "err", upstreamErr.Error()) http.Error(w, "Not found upstream", upstreamErr.StatusCode) return } - // #log level warn - log.Printf("fetch error: %v", err) + slog.Warn("fetch error", "err", err) http.Error(w, "Failed to fetch from upstream", http.StatusBadGateway) return } @@ -51,8 +48,7 @@ func (s *Server) handlePackage(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Length", strconv.FormatInt(cachedFile.Size, 10)) _, err = io.Copy(w, cachedFile.Reader) if err != nil { - // #log error - log.Printf("error streaming file to client: %v", err) + slog.Warn("streaming error", "err", err) } } diff --git a/main.go b/main.go index 9fca7e6..fb3c764 100644 --- a/main.go +++ b/main.go @@ -2,8 +2,10 @@ package main import ( "flag" - "log" + "fmt" + "log/slog" "net/http" + "os" "github.com/ewpt3ch/pkgstash/internal/cache" ) @@ -15,18 +17,33 @@ type Server struct { func main() { - // set config from flag if available + // get options from cli flags var configPath string flag.StringVar(&configPath, "config", "", "path to config file") + logFlag := flag.String("loglevel", "INFO", "loglevel: DEBUG, INFO, WARN, ERROR") flag.Parse() + + // set config from flag if available if len(configPath) == 0 { configPath = "/etc/pkgstash/pkgstash.toml" } + //set log level from flag if available + var logLevel slog.Level + if err := logLevel.UnmarshalText([]byte(*logFlag)); err != nil { + fmt.Fprintf(os.Stderr, "invalid log level %q, defaulting to INFO\n", *logFlag) + logLevel = slog.LevelInfo + } + + logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ + Level: logLevel, + })) + slog.SetDefault(logger) + cfg, err := ReadConfig(configPath) if err != nil { - // #log error - log.Fatal(err) + slog.Error("failed to read config", "err", err) + os.Exit(1) } c := cache.NewCache(cfg.CacheRoot, cfg.MirrorURLs, cfg.MirroredRepos) @@ -37,8 +54,8 @@ func main() { mux.HandleFunc("POST /api/refresh", srv.handlerRefresh) if err := srv.c.Refresh(); err != nil { - // #log error - log.Fatal(err) + slog.Error("failed to refesh db files", "err", err) + os.Exit(1) } httpServe := &http.Server{ @@ -46,8 +63,10 @@ func main() { Handler: mux, } - // #log error - log.Printf("serving pkgstash root: %v on port: %v", cfg.CacheRoot, cfg.Port) - log.Fatal(httpServe.ListenAndServe()) + slog.Info("serving pkgstash", "root", cfg.CacheRoot, "port", cfg.Port) + if err = httpServe.ListenAndServe(); err != nil { + slog.Error("server failed", "err", err) + os.Exit(1) + } }