forked from sneak/simplelog
Compare commits
5 Commits
feat/relp-
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 9121da9aae | |||
| 74ce052b77 | |||
| 1eef38a5fa | |||
| 97a82e9b2c | |||
|
|
869b7ca4c3 |
@ -3,8 +3,9 @@ package simplelog
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"log"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
type JSONHandler struct{}
|
type JSONHandler struct{}
|
||||||
@ -15,7 +16,7 @@ func NewJSONHandler() *JSONHandler {
|
|||||||
|
|
||||||
func (j *JSONHandler) Handle(ctx context.Context, record slog.Record) error {
|
func (j *JSONHandler) Handle(ctx context.Context, record slog.Record) error {
|
||||||
jsonData, _ := json.Marshal(record)
|
jsonData, _ := json.Marshal(record)
|
||||||
log.Println(string(jsonData))
|
fmt.Fprintln(os.Stdout, string(jsonData))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
33
json_handler_test.go
Normal file
33
json_handler_test.go
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package simplelog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log/slog"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestJSONHandlerDeadlock verifies that JSONHandler.Handle does not deadlock
|
||||||
|
// when the default slog handler routes log.Println back through slog.
|
||||||
|
// On the unfixed code this test will hang (deadlock); with the fix it completes.
|
||||||
|
func TestJSONHandlerDeadlock(t *testing.T) {
|
||||||
|
handler := NewJSONHandler()
|
||||||
|
|
||||||
|
// Set our handler as the default so log.Println routes through slog
|
||||||
|
logger := slog.New(handler)
|
||||||
|
slog.SetDefault(logger)
|
||||||
|
|
||||||
|
done := make(chan struct{})
|
||||||
|
go func() {
|
||||||
|
// This call deadlocks on unfixed code because Handle() calls
|
||||||
|
// log.Println() which re-enters slog → Handle() → log.Println() …
|
||||||
|
slog.Info("test message")
|
||||||
|
close(done)
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-done:
|
||||||
|
// success
|
||||||
|
case <-time.After(5 * time.Second):
|
||||||
|
t.Fatal("JSONHandler.Handle deadlocked: timed out after 5 seconds")
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user