Files
job-search/internal/logging/logging.go
T
bwilliams dcb714dc19 Some bug fixes:
- logging: LogToFile shadowed the package-level fileLogger, so
  IsFileLogger was always false and Shutdown never closed the file
- logging: replace IsJSONHandler's unsafe reflection into slog
  internals with a *slog.JSONHandler type check
- cli: fail if the log file can't be opened instead of silently
  logging to the terminal; return the log shutdown error from Finish
- build.sh: -X flags used the wrong module path, so the version, build
  time and commit were never stamped
2026-10-09 17:58:48 +01:00

82 lines
1.5 KiB
Go

package logging
import (
"log/slog"
"os"
"github.com/lmittmann/tint"
)
// ---------- Standard log handling (terminal or file based) ----------
var logLevel slog.LevelVar
var fileLogger *os.File
// Set the logging to a particular level, quietly
func SetLevel(level slog.Level) {
logLevel.Set(level)
}
// Enable debug level logging
func EnableDebug() {
if logLevel.Level() > slog.LevelDebug {
logLevel.Set(slog.LevelDebug)
slog.Debug("Debug logging enabled")
}
}
func LogToFile(logfile string) error {
if fileLogger != nil {
(*fileLogger).Close()
}
// Open the log file
var err error
fileLogger, err = os.OpenFile(logfile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o600)
if err != nil {
return err
}
opts := &slog.HandlerOptions{
Level: &logLevel,
}
handler := slog.NewJSONHandler(fileLogger, opts)
logger := slog.New(handler)
slog.SetDefault(logger)
return nil
}
func Shutdown() error {
var err error = nil
if fileLogger != nil {
err = (*fileLogger).Close()
fileLogger = nil
}
return err
}
func LogToTerminal() {
opts := &tint.Options{
Level: &logLevel,
TimeFormat: "*",
}
handler := tint.NewTextHandler(os.Stdout, opts)
logger := slog.New(handler)
slog.SetDefault(logger)
}
// IsJSONHandler reports whether h writes JSON, as the file logger does.
func IsJSONHandler(h slog.Handler) bool {
_, ok := h.(*slog.JSONHandler)
return ok
}
func IsFileLogger() bool {
return fileLogger != nil
}
func IsDebugEnabled() bool {
return logLevel.Level() <= slog.LevelDebug
}