Logging#

init installs a tracing subscriber writing to two places: the module’s stderr, which the host forwards into its own log, and a file in the instance directory, which get_log_path() names so a consumer can hand the run over afterwards.

What is logged#

Three targets carry the chat core’s account of a run: libchat (the conversation core, MLS groups, inbox), logos_generic_chat (the threaded client and its inbound worker), and chat_module itself. The module is one of them because the other two are nearly silent: between them they raise eleven events, almost all on paths that are already failing, so a run that merely behaves oddly would write nothing. This module reports its own lifecycle instead, and logs a message as a byte count and a conversation id, never as content.

Choosing a level#

log_level on the ChatConfig record sets those three targets and nothing else (error, warn, info, debug or trace, defaulting to info), leaving everything around them at warn, because the crates underneath the chat core have an order of magnitude more info sites than it does.

RUST_LOG, read from the environment the module process inherits from its host, outranks the client’s choice and replaces the composition outright, so a verbose run names every target it wants:

RUST_LOG=warn,chat_module=debug,libchat=debug,logos_generic_chat=debug

The level is read once, at the first init, and a later init leaves it as it was.

Panics#

A panic goes into the log file too, with a backtrace. It cannot arrive as a tracing event, since panic = "abort" means the process is already on its way down, so the panic hook writes it directly and captures the backtrace whether or not RUST_BACKTRACE was set.

The files#

The file is chat_module_<stamp>.log, moved aside as chat_module_<stamp>.NNN.log when it fills and reopened under the announced name, with the ten most recent runs kept. That naming is what lets a consumer group the directory into runs — and lets a second writer keep its own log alongside without either knowing about the other, since the grouping reads the stem off the announced path.

Line format#

A line on stderr is <SEVERITY>: <target>: <message>, with WARNING for a warning because that is the token a host ranks the line by, and with no timestamp because the host stamps what it re-emits. A reader downstream gets the level from the host’s own column and the domain from the target. The same line in the file leads with an ISO-8601 time, because nothing else stamps it and reading it against another writer’s log takes one.

Only the stderr half meets that host classifier, which is why debug and trace are worth asking for: a host drops what it ranks below its own level, and the file is written directly and drops nothing.