Files the C++ tooling already reads
What this writes is the .xlog the C++ implementation writes — same framing, same compression, same encryption — so upstream's decoders, and any tooling built on them, read your logs without a conversion step.
The .xlog logger, the STN task pipeline and the SDT network diagnosis of Tencent/mars — from Rust, Swift, Kotlin, Flutter, React Native, HarmonyOS or plain C.
What this writes is the .xlog the C++ implementation writes — same framing, same compression, same encryption — so upstream's decoders, and any tooling built on them, read your logs without a conversion step.
Open an appender once, write a tag and a message through it, flush before you upload. Rust, Swift, Kotlin, Kotlin Multiplatform, Flutter, React Native, HarmonyOS and C spell the same three steps with the same options.
The default async mode hands the record to a writer thread through a memory-mapped cache, so a write returns without waiting for the disk. `requestFlush()` asks for the drain and returns at once, `flushNow()` drains it on the calling thread, and `await flush()` hands it to another thread and answers when it is over.
zlib or zstd per file, ECDH + TEA per record when you give it a public key, and a size or an age at which a file is closed and a new one opened.
STN runs a request as a task — queued, retried, timed out, reported, over a short link or a long link the app keeps. SDT answers why a host stopped answering: ping, DNS, TCP and HTTP, and a JSON report of what each found.
STN and SDT keep no thread of their own: what would have been one is a call the host makes — `run_pending()` and `due_delay()` for the pipeline, `runChecks` and its probes for the diagnosis — and `Driver::spawn()` is the drain thread you can ask for. The one thread this library starts unasked is the appender's async writer, which is what async mode is; sync mode starts none.