sane logging defaults for go
Go to file
sneak 3638c0c4df aider: Add file and line number information to ExtendedEvent in CustomHandler.
# Aider chat conversation:

USER: create an extended type called ExtendedEvent which conforms to Event.  in the custom handler, attach the file and line number information from the caller to the ExtendedEvent.  that way all of the extendedhandlers can access it without using the runtime module.  add getters to the ExtendedEvent interface and type.

ASSISTANT: To create an `ExtendedEvent` type that conforms to `Event` and includes file and line number information, we need to:

1. Define the `ExtendedEvent` type and interface in `event.go`.
2. Update the `CustomHandler` in `simplelog.go` to attach file and line number information to the `ExtendedEvent`.
3. Add getters to the `ExtendedEvent` interface and type.

Here are the *SEARCH/REPLACE* blocks:

event.go
```go
<<<<<<< SEARCH
}
=======
}

type ExtendedEvent interface {
	GetID() uuid.UUID
	GetTimestamp() time.Time
	GetLevel() string
	GetMessage() string
	GetData() json.RawMessage
	GetFile() string
	GetLine() int
}

type extendedEvent struct {
	Event
	File string `json:"file"`
	Line int    `json:"line"`
}

func (e extendedEvent) GetID() uuid.UUID {
	return e.ID
}

func (e extendedEvent) GetTimestamp() time.Time {
	return e.Timestamp
}

func (e extendedEvent) GetLevel() string {
	return e.Level
}

func (e extendedEvent) GetMessage() string {
	return e.Message
}

func (e extendedEvent) GetData() json.RawMessage {
	return e.Data
}

func (e extendedEvent) GetFile() string {
	return e.File
}

func (e extendedEvent) GetLine() int {
	return e.Line
}

func NewExtendedEvent(level, message string, data json.RawMessage, file string, line int) ExtendedEvent {
	return extendedEvent{
		Event: NewEvent(level, message, data),
		File:  file,
		Line:  line,
	}
}
>>>>>>> REPLACE
```

simplelog.go
```go
<<<<<<< SEARCH
	"log"
=======
	"log"
	"runtime"
>>>>>>> REPLACE
```

simplelog.go
```go
<<<<<<< SEARCH
	event := NewEvent(record.Level.String(), record.Message, jsonData)
	select {
	case r.ch <- event:
		return nil // Successfully sent event to channel
	default:
		return fmt.Errorf("failed to log event: channel is full")
	}
=======
	// Get the caller information
	_, file, line, ok := runtime.Caller(5)
	if !ok {
		file = "???"
		line = 0
	}

	event := NewExtendedEvent(record.Level.String(), record.Message, jsonData, file, line)
	for _, handler := range cl.handlers {
		if err := handler.Handle(ctx, event); err != nil {
			return err
		}
	}
	return nil
>>>>>>> REPLACE
```
2024-05-14 05:20:44 -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: Add file and line number information to ExtendedEvent in CustomHandler. 2024-05-14 05:20:44 -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: Add file and line number information to ExtendedEvent in CustomHandler. 2024-05-14 05:20:44 -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"))
}