sane logging defaults for go
Go to file
sneak 7e0266aefc aider: Rename CustomHandler to MultiplexHandler.
# Aider chat conversation:

USER: rename CustomHandler to MultiplexHandler

ASSISTANT: Here are the necessary changes to rename `CustomHandler` to `MultiplexHandler`:

simplelog.go
```go
<<<<<<< SEARCH
	ourCustomHandler = NewCustomHandler()
=======
	ourCustomHandler = NewMultiplexHandler()
>>>>>>> REPLACE
```

simplelog.go
```go
<<<<<<< SEARCH
type CustomHandler struct {
=======
type MultiplexHandler struct {
>>>>>>> REPLACE
```

simplelog.go
```go
<<<<<<< SEARCH
func NewCustomHandler() slog.Handler {
	cl := &CustomHandler{}
=======
func NewMultiplexHandler() slog.Handler {
	cl := &MultiplexHandler{}
>>>>>>> REPLACE
```

simplelog.go
```go
<<<<<<< SEARCH
func (cl *CustomHandler) Handle(ctx context.Context, record slog.Record) error {
=======
func (cl *MultiplexHandler) Handle(ctx context.Context, record slog.Record) error {
>>>>>>> REPLACE
```

simplelog.go
```go
<<<<<<< SEARCH
func (cl *CustomHandler) Enabled(ctx context.Context, level slog.Level) bool {
=======
func (cl *MultiplexHandler) Enabled(ctx context.Context, level slog.Level) bool {
>>>>>>> REPLACE
```

simplelog.go
```go
<<<<<<< SEARCH
func (cl *CustomHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
	newHandlers := make([]ExtendedHandler, len(cl.handlers))
	for i, handler := range cl.handlers {
		newHandlers[i] = handler.WithAttrs(attrs)
	}
	return &CustomHandler{handlers: newHandlers}
}

func (cl *CustomHandler) WithGroup(name string) slog.Handler {
	newHandlers := make([]ExtendedHandler, len(cl.handlers))
	for i, handler := range cl.handlers {
		newHandlers[i] = handler.WithGroup(name)
	}
	return &CustomHandler{handlers: newHandlers}
=======
func (cl *MultiplexHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
	newHandlers := make([]ExtendedHandler, len(cl.handlers))
	for i, handler := range cl.handlers {
		newHandlers[i] = handler.WithAttrs(attrs)
	}
	return &MultiplexHandler{handlers: newHandlers}
}

func (cl *MultiplexHandler) WithGroup(name string) slog.Handler {
	newHandlers := make([]ExtendedHandler, len(cl.handlers))
	for i, handler := range cl.handlers {
		newHandlers[i] = handler.WithGroup(name)
	}
	return &MultiplexHandler{handlers: newHandlers}
>>>>>>> REPLACE
```
2024-05-14 05:26:56 -07:00
tools aider is not great 2024-05-14 04:50:42 -07:00
.gitignore add .gitignore 2024-05-13 21:43:54 -07:00
console_handler.go aider: Include filename and line number in console logger output by using runtime.Caller to get the caller information. 2024-05-14 05:17:29 -07:00
event.go aider: Moved the ExtendedEvent type and interface to simplelog.go. 2024-05-14 05:22:26 -07:00
go.mod initial 2024-05-13 21:43:47 -07:00
go.sum initial 2024-05-13 21:43:47 -07:00
handler.go aider: Fixed undefined variables and types, updated handlers to use slog.Handler interface, and defined missing event variables. 2024-05-14 04:52:13 -07:00
json_handler.go aider: Import the log/slog package to fix the undefined slog error in json_handler.go. 2024-05-14 04:57:24 -07:00
Makefile initial 2024-05-13 21:43:47 -07:00
README.md initial 2024-05-13 21:43:47 -07:00
relp_handler.go aider: Use os.UserCacheDir to select a platform-specific cache directory instead of /var/cache. 2024-05-14 05:07:02 -07:00
simplelog_test.go initial 2024-05-13 21:43:47 -07:00
simplelog.go aider: Rename CustomHandler to MultiplexHandler. 2024-05-14 05:26:56 -07:00
TODO initial 2024-05-13 21:43:47 -07:00
webhook_handler.go aider: Add Enabled, WithAttrs, and WithGroup methods to WebhookHandler to implement the slog.Handler interface. 2024-05-14 05:00:12 -07:00

simplelog

simplelog is an opinionated logging package designed to facilitate easy and structured logging in Go applications with an absolute minimum of boilerplate.

The idea is that you can add a single import line which replaces the stdlib log/slog default handler, and solve the 90% case for logging.

Features

  • if output is a tty, outputs pretty color logs
  • if output is not a tty, outputs json
  • supports delivering logs via tcp RELP (e.g. to remote rsyslog using imrelp)
  • supports delivering each log message via a webhook

Installation

To use simplelog, first ensure your project is set up with Go modules:

go mod init your_project_name

Then, add SimpleLog to your project:

go get git.eeqj.de/sneak/go-simplelog

Usage

Below is an example of how to use SimpleLog in a Go application. This example is provided in the form of a main.go file, which demonstrates logging at various levels using structured logging syntax.

package main

import (
	"log/slog"
	_ "git.eeqj.de/sneak/go-simplelog"
)

func main() {

    // log structured data with slog as usual:
	slog.Info("User login attempt", slog.String("user", "JohnDoe"), slog.Int("attempt", 3))
	slog.Warn("Configuration mismatch", slog.String("expected", "config.json"), slog.String("found", "config.dev.json"))
	slog.Error("Failed to save data", slog.String("reason", "permission denied"))
}