- 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
82 lines
1.5 KiB
Go
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
|
|
}
|