Skip to content

fix(logging): use structured key/value form at misused call sites#729

Merged
edenreich merged 3 commits into
mainfrom
fix/logger-structured-kv-723
Jul 2, 2026
Merged

fix(logging): use structured key/value form at misused call sites#729
edenreich merged 3 commits into
mainfrom
fix/logger-structured-kv-723

Conversation

@edenreich

Copy link
Copy Markdown
Contributor

Summary

internal/logger's Debug/Info/Warn/Error/Fatal(msg string, args ...any) forward to zap's sugared
key/value API (Warnw/Errorw/…). ~18 call sites instead passed a printf-style format string
(%s/%v/%d) with trailing positional args, so:

  • the verbs were never expanded (a literal %s landed in the log), and
  • the trailing args were misread as key/value pairs — an odd count left a dangling key, making zap
    emit an extra error-level Ignored key without a value. line.

This is the same defect class as the keybinding log flood (#722, fixed in #724, which corrected the two
worst offenders and tracked the rest in #723). This PR closes the remaining sites.

Changes

  • Convert 18 call sites to structured key/value form, following the fix(keybindings): stop "unknown keybinding action" log flood #724 precedent
    (logger.Warn("failed to …", "error", err)). Multi-word keys use the repo's snake_case house style
    (chat_id, original_bytes).
    • internal/ui/keybinding/actions.go (7), internal/agent/agent_utils.go (5),
      internal/services/channels/telegram.go (4), internal/app/chat.go (1),
      internal/container/container.go (1)
  • Enable the loggercheck linter (no-printf-like + wrapper rules for internal/logger.*) so
    this class cannot regress.

The 9 other logger calls that contain a % were verified as correct fmt.Sprintf usage (message
pre-formatted, or building a properly-keyed value) and left untouched.

Verification

  • task build, task test (full suite), and task lint (0 issues, loggercheck active) all pass.
  • Confirmed the guard is live: a deliberate misuse is flagged by loggercheck
    (odd number of arguments passed as key-value pairs for logging); the fixed tree lints clean.

no docs ticket: internal-only fix

Closes #723

~18 call sites passed printf-style format strings (%s/%v/%d) with trailing
positional args to internal/logger's Debug/Info/Warn/Error/Fatal, which
forward to zap's sugared key/value API (Warnw/Errorw/...). The verbs were
never expanded and the trailing args were misread as key/value pairs; an
odd arg count left a dangling key, so zap emitted an extra error-level
"Ignored key without a value." line.

Convert each site to structured key/value form (following #722/#724), and
enable the loggercheck linter (no-printf-like + wrapper rules) so the whole
class cannot regress.

no docs ticket: internal-only fix

Closes #723

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@edenreich edenreich requested a review from a team as a code owner July 2, 2026 17:57
Comment thread .golangci.yml Outdated
edenreich added 2 commits July 2, 2026 20:05
Co-authored-by: Eden Reich <eden.reich@gmail.com>
Removed exclusion for staticcheck SA5011 in tests.
@edenreich edenreich merged commit cd96028 into main Jul 2, 2026
1 check passed
@edenreich edenreich deleted the fix/logger-structured-kv-723 branch July 2, 2026 18:21
inference-gateway-releaser Bot added a commit that referenced this pull request Jul 3, 2026
## [0.128.0](v0.127.0...v0.128.0) (2026-07-03)

### 🚀 Features

* **chat:** make status indicators selectable with /tools and /a2a views ([#732](#732)) ([6882de0](6882de0)), closes [#717](#717) [#717](#717)

### 🐛 Bug Fixes

* **agent:** drop redundant Idle transition that errored on every run ([#726](#726)) ([469ec64](469ec64)), closes [#722](#722) [#725](#725)
* **agent:** report session-cumulative total_turns in completion logs ([#728](#728)) ([0d8fb08](0d8fb08)), closes [#727](#727)
* **a2a:** route active A2A reads and HasPending through the job supervisor ([#693](#693)) ([#721](#721)) ([dcd0670](dcd0670)), closes [#718](#718) [#719](#719) [#720](#720)
* **keybindings:** stop "unknown keybinding action" log flood ([#724](#724)) ([c828426](c828426)), closes [#714](#714) [#722](#722)
* **a2a:** unify background-job liveness, clear, and cancel on the supervisor contract ([#730](#730)) ([eb37fd0](eb37fd0)), closes [#693](#693) [#720](#720) [#718](#718) [#719](#719)
* **logging:** use structured key/value form at misused call sites ([#729](#729)) ([cd96028](cd96028)), closes [#722](#722) [#724](#724) [#724](#724) [#723](#723)
* **tools:** wait for pipe readers before reaping detached bash shells ([#716](#716)) ([e1d0d84](e1d0d84)), closes [#696](#696)

### ⚡ Performance Improvements

* **tui:** cache per-entry rendering and keep the Update loop responsive ([#731](#731)) ([8c9db0d](8c9db0d))

### 📚 Documentation

* **a2a:** add SKILL.md documentation for Agent2Agent protocol ([defcd57](defcd57))

### 🔧 Build System

* **deps:** bump golang.org/x/net from 0.47.0 to 0.55.0 in /examples/mcp/mcp-server ([#715](#715)) ([990803b](990803b))

### 🧹 Maintenance

* **flox:** bump dev deps ([d0c8f6b](d0c8f6b))
@inference-gateway-releaser

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 0.128.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Structured logger misused printf-style at ~20 call sites (malformed logs)

1 participant