aboutsummaryrefslogtreecommitdiffstats
path: root/logging/log.go
diff options
context:
space:
mode:
authorMarc Pervaz Boocha <mboocha@sudomsg.com>2025-07-27 15:43:06 +0530
committerMarc Pervaz Boocha <mboocha@sudomsg.com>2025-07-27 15:43:06 +0530
commit41178f6bad1f2e1eaed462475cb7aa26185dc0ac (patch)
tree8c025140c6d1d35d02246ea413b135da93021532 /logging/log.go
downloadgopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar
gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.gz
gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.bz2
gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.lz
gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.xz
gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.tar.zst
gopkgserver-41178f6bad1f2e1eaed462475cb7aa26185dc0ac.zip
Initial Commit
Diffstat (limited to '')
-rw-r--r--logging/log.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/logging/log.go b/logging/log.go
new file mode 100644
index 0000000..8e3078f
--- /dev/null
+++ b/logging/log.go
@@ -0,0 +1,56 @@
+package logging
+
+import (
+ "context"
+ "io"
+ "log/slog"
+ "os"
+ "runtime"
+)
+
+type Config struct {
+ Level slog.Level `toml:"level"`
+ File string `toml:"file"`
+}
+
+func SetupLogger(cfg Config) *slog.Logger {
+ opts := &slog.HandlerOptions{Level: cfg.Level}
+ var handler slog.Handler
+
+ var writter io.Writer
+ writter = os.Stdout
+ if cfg.File != "" {
+ f, _ := os.OpenFile(cfg.File, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+ writter = f
+ }
+ handler = slog.NewJSONHandler(writter, opts)
+
+ logger := slog.New(handler)
+ slog.SetDefault(logger)
+ return logger
+}
+
+type contextKeyType struct{}
+
+var contextKey contextKeyType
+
+func WithLogger(ctx context.Context, logger *slog.Logger) context.Context {
+ return context.WithValue(ctx, contextKey, logger)
+}
+
+func FromContext(ctx context.Context) *slog.Logger {
+ if logger, ok := ctx.Value(contextKey).(*slog.Logger); ok {
+ return logger
+ }
+ return slog.Default()
+}
+
+func RecoverLog(ctx context.Context, err any) {
+ logger := FromContext(ctx)
+
+ const size = 64 << 10
+ buf := make([]byte, size)
+ buf = buf[:runtime.Stack(buf, false)]
+
+ logger.Log(ctx, slog.LevelError, "Program Paniced", "error", err, "stack", string(buf))
+}