sane logging defaults for go
Go to file
sneak 2b96a4c59b aider: Added logging for connection success, failure, and reconnection when relpDebug is set.
# 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
```
2024-05-14 04:33:30 -07:00
tools initial 2024-05-13 21:43:47 -07:00
.gitignore add .gitignore 2024-05-13 21:43:54 -07:00
console_handler.go initial 2024-05-13 21:43:47 -07:00
custom_logger.go initial 2024-05-13 21:43:47 -07:00
event.go initial 2024-05-13 21:43:47 -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 initial 2024-05-13 21:43:47 -07:00
json_handler.go initial 2024-05-13 21:43:47 -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: Added logging for connection success, failure, and reconnection when relpDebug is set. 2024-05-14 04:33:30 -07:00
simplelog_test.go initial 2024-05-13 21:43:47 -07:00
TODO initial 2024-05-13 21:43:47 -07:00
webhook_handler.go initial 2024-05-13 21:43:47 -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"))
}