-
released this
2026-08-02 22:33:22 -05:00 | 3 commits to main since this releaseThese logs are read in Portainer, whose JSON log viewer renders exactly five
keys —time,level,caller,message,stack_trace— and demotes every
other key to a trailingkey=valuepair at the far end of the line. aufhocker
was emitting its timestamp under a name that viewer does not know, and burying
its startup configuration in a wall of JSON.First of three releases fixing that; see
docs/LOGGING_PLAN.md.Changed
- The timestamp is
time, nottimestamp. Winston writes its timestamp to
info.timestamp, which is not one of the five, so every line arrived with no
timestamp column at all and the clock trailing the fields. Renamed once in
the logger's format, immediately afterformat.timestamp()— no call site
changed. service=aufhockerno longer appears on every line.defaultMetaput it
on all of them, as one more demotedkey=valuepair; the container name
already says which service these came from.- The startup configuration is six lines rather than one.
Config.getSummary()returned a deeply nested object
(storage.databaseTarget.host), and an unrecognised key holding an object is
flattened to JSON inside its trailing pair — so the first thing you saw in
the logs was a single very long line of JSON. It is nowgetSummaryLines():
one line per area (config/runtime,config/discord,config/claude,
config/storage,config/limits,config/admin), flat scalar fields only,
each tagged with acallerso the group reads as a section instead of six
unrelated boot messages. Secrets stay masked exactly as before — booleans for
keys, and the database ashost:port/database, never the DSN, which carries
the password. - The production stdout transport no longer re-applies
format.timestamp(). A
transport format runs after the logger's, so it would have written a fresh
timestampkey and undone the rename on the one transport Portainer reads.
Added
tzin theconfig/runtimeline. The deploy setsTZ=America/Chicago,
and this is the only way to tell from the outside which clock everytime
field is written against.databaseLabel()alongsidedescribeDatabaseUrl()in the config module —
the same parse, rendered as onehost:port/databasefield.
Deployment
TZ=America/Chicagois a stack edit (aufhocker.yaml), not part of the
image: update the stack in Portainer, or the newtimefield keeps reading
UTC. Nothing else in the bot schedules off local time — the d2emu poll fires on
the:00/:30minute marks and America/Chicago is a whole-hour offset from
UTC, so its schedule is unchanged to the millisecond.
Minor rather than patch for the changed log output. No schema, command, or
config-input changes.callertags on every line, real stack traces, and a
boot preflight block follow in two further releases.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- The timestamp is