The webhook handler's client had no timeout, and slog calls the handler inside the log call, so a server that accepted the connection and never answered stopped that log call for good, and every later one. A request still running after 5 seconds, reading the answer included, now fails with a timeout error. The handler also reads the answer to the end before closing it, so the connection is reused for the next record. Two new tests point the handler at a server that never answers and at one that sends its status and then stalls the answer, and check that Handle returns a timeout error within the timeout. The README states the timeout. Model: opus-5-5
3.9 KiB
3.9 KiB
Workflow
- branch (from
main) - do the work in Next Step
- move Next Step to the top of Completed Steps
- move the top item of Future Steps into Next Step
- commit (
TODO.mdchanges in the same commit as the work) - merge to
mainif the branch is not protected, otherwise open a PR - push
Status
1.0+
Tagged v1.0.0 (2024-06-14) and 1.0.1 (2026-02-08). In post-1.0 maintenance; the library is referenced by the Go styleguide.
Next Step
Bring the Makefile up to policy in one commit: add fmt-check, check, and hooks targets (test/lint/fmt/docker exist) and add the missing policy files it depends on: .golangci.yml, REPO_POLICIES.md, .editorconfig, .dockerignore, and .gitea/workflows/check.yml running make check.
Completed Steps
- 2026-10-06: a webhook request now times out after 5 seconds, so a server that never answers no longer stops every log call; the webhook handler also reads each answer to the end so its connection is reused
- 2026-10-06: the console handler takes the file and line it prints from
the record's
PCinstead of counting stack frames, so they name the call site whether the record came through aslog.Loggeror straight toHandle - 2026-10-06: the tests run under the race detector, in Docker:
script/testbuilds theteststage of theDockerfile, which runsgo test -race, and a new final stage makes a plaindocker buildrun both thelintandteststages - 2026-10-06: the linter runs only in Docker:
script/lintbuilds thelintstage of theDockerfile, everydocker buildinscript/runs without the build cache, andscript/bootstrapno longer installs golangci-lint - 2026-10-06: every handler now returns a failed delivery from
Handleinstead of discarding it: console and JSON return the stdout write error, the webhook also fails on a non-2xx answer, and the multiplex delivers to every handler and returns their errors joined - 2026-08-10: fixed every handler discarding slog attributes: console, JSON and webhook handlers now emit record attributes, accumulate WithAttrs without mutating the receiver, and honour WithGroup; slog.Group values nest and LogValuer values are resolved; console keys and values holding invalid UTF-8 are quoted
- 2026-08-07: added canonical
.golangci.yml(v2 schema), pinned theDockerfilelint stage to golangci-lint v2.12.2 (tag+digest), and fixed all findings the v1→v2 jump surfaced without changing any exported signatures or behavior
- 2026-07-07 Adopted scripts-to-rule-them-all:
script/entrypoints, Makefile shims, README Entrypoints section
- 2026-02-08: fixed JSONHandler deadlock from recursive log.Println, with regression test; tagged 1.0.1
- 2024-06-14: 1.0 prep: lint and fmt enforced in Docker build, call stack depth fix so log locations report correctly, example script, removed non-building RELP code; tagged v1.0.0
- 2024-05-22: module path moved to sneak.berlin/go/simplelog
- 2024-05-14: initial library: slog-based console, JSON, webhook, and RELP handlers, MultiplexHandler, caller file/line info, UTC ISO timestamps, level-colored output
Future Steps
- Restructure README.md into the standard sections: Description, Getting Started, Rationale, Design, TODO, License, Author
- Delete the old plain TODO file once this TODO.md lands
- Add .aider.* to .gitignore and remove the stray aider artifacts from the working tree
- Pick one tag scheme before the next release (v1.0.0 vs 1.0.1 are inconsistent)
- Tag v1.0.2, with the leading v, once the attribute fix lands, so consuming repos can move off pseudo-version pins in one step
- Fix RELP output to cache (from old TODO)
- Re-add RELP delivery over TCP to remote rsyslog imrelp; removed 2024-06-14 because it did not build (README planned feature)
- Add regex filtering for webhook logs (from old TODO)
- Better console output format (from old TODO)