sane logging defaults for go
# Aider chat conversation:
USER: continuing with the relpDebug theme, make it log messages on connection success, connection failure, and reconnection if relpDebug is set
ASSISTANT: To make this change we need to modify `relp_handler.go` to:
1. Add logging for successful connection in the `Startup` method.
2. Add logging for failed connection in the `connectToRELPServer` method.
3. Add logging for reconnection in the `watchDirectoryForFailedEventFiles` method.
Here are the *SEARCH/REPLACE* blocks:
relp_handler.go
```go
<<<<<<< SEARCH
r.conn, err = r.connectToRELPServer()
if err != nil {
return fmt.Errorf("Failed to establish TCP connection: %v", err)
}
=======
r.conn, err = r.connectToRELPServer()
if err != nil {
if relpDebug {
log.Printf("Failed to establish TCP connection: %v", err)
}
return fmt.Errorf("Failed to establish TCP connection: %v", err)
}
if relpDebug {
log.Printf("Successfully connected to RELP server at %s", r.relpServerURL)
}
>>>>>>> REPLACE
```
relp_handler.go
```go
<<<<<<< SEARCH
conn, err := net.Dial("tcp", net.JoinHostPort(host, port))
if err != nil {
return nil, err
}
return conn, nil
=======
conn, err := net.Dial("tcp", net.JoinHostPort(host, port))
if err != nil {
if relpDebug {
log.Printf("Failed to connect to RELP server at %s: %v", net.JoinHostPort(host, port), err)
}
return nil, err
}
if relpDebug {
log.Printf("Successfully connected to RELP server at %s", net.JoinHostPort(host, port))
}
return conn, nil
>>>>>>> REPLACE
```
relp_handler.go
```go
<<<<<<< SEARCH
if r.isConnected() {
files, err := ioutil.ReadDir(cacheDir)
if err != nil {
log.Printf("Error reading cache directory: %v", err)
continue
}
for _, file := range files {
filePath := filepath.Join(cacheDir, file.Name())
data, err := ioutil.ReadFile(filePath)
if err != nil {
log.Printf("Error reading file %s: %v", file.Name(), err)
continue
}
var event Event
if err := json.Unmarshal(data, &event); err != nil {
log.Printf("Error unmarshalling event from file %s: %v", file.Name(), err)
continue
}
r.ch <- event
os.Remove(filePath) // Remove file after processing
}
}
=======
if r.isConnected() {
if relpDebug {
log.Printf("Reconnected to RELP server at %s", r.relpServerURL)
}
files, err := ioutil.ReadDir(cacheDir)
if err != nil {
log.Printf("Error reading cache directory: %v", err)
continue
}
for _, file := range files {
filePath := filepath.Join(cacheDir, file.Name())
data, err := ioutil.ReadFile(filePath)
if err != nil {
log.Printf("Error reading file %s: %v", file.Name(), err)
continue
}
var event Event
if err := json.Unmarshal(data, &event); err != nil {
log.Printf("Error unmarshalling event from file %s: %v", file.Name(), err)
continue
}
r.ch <- event
os.Remove(filePath) // Remove file after processing
}
}
>>>>>>> REPLACE
```
|
||
|---|---|---|
| tools | ||
| .gitignore | ||
| console_handler.go | ||
| custom_logger.go | ||
| event.go | ||
| go.mod | ||
| go.sum | ||
| handler.go | ||
| json_handler.go | ||
| Makefile | ||
| README.md | ||
| relp_handler.go | ||
| simplelog_test.go | ||
| TODO | ||
| webhook_handler.go | ||
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"))
}