Logaffe.Client
0.2.7
See the version list below for details.
dotnet add package Logaffe.Client --version 0.2.7
NuGet\Install-Package Logaffe.Client -Version 0.2.7
<PackageReference Include="Logaffe.Client" Version="0.2.7" />
<PackageVersion Include="Logaffe.Client" Version="0.2.7" />
<PackageReference Include="Logaffe.Client" />
paket add Logaffe.Client --version 0.2.7
#r "nuget: Logaffe.Client, 0.2.7"
#:package Logaffe.Client@0.2.7
#addin nuget:?package=Logaffe.Client&version=0.2.7
#tool nuget:?package=Logaffe.Client&version=0.2.7
Logaffe.Client
Delivery of log entries to a logaffe installation — a self-hostable, central logging tool for a single operator and their AI agent.
This is the layer underneath the two logging-framework packages, and it is the one to reach for when the application logs through neither of them:
- Logaffe.Serilog — a Serilog sink
- Logaffe.Extensions.Logging — an
ILoggerProvider
Use
using Logaffe.Client;
await using var delivery = new EntryDelivery(new EntryDeliveryOptions
{
Installation = new Uri("https://logs.example.com"),
IngestToken = "logaffe_ingest_…",
});
delivery.Send("""
{"@t":"2026-08-13T14:12:03.417Z","@mt":"Order {OrderId} shipped","OrderId":4711}
""");
Send takes one CLEF line and returns immediately.
It never throws and never blocks.
A delivery never names a project: the token is the project. The address is scheme and host as the operator reaches the installation — the ingest path is appended and is not a setting.
What it promises
Fire-and-forget, and it means it. Entries go into a bounded in-memory queue and a background loop delivers them. The queue drops the oldest entries when it is full rather than growing, because an unbounded queue turns a logging outage into an outage of the application, which is the one thing this exists to prevent.
Nothing is guaranteed to arrive. There is no durable client-side buffer and no retry that outlives the process. This is affordable because logaffe is additive: the application keeps its own file logging, so a delivery that is lost costs a convenience and never the record.
Failures are reported to you, not swallowed. OnFailure is a delegate
rather than an ILogger, so this package asks nothing of the application's
logging stack. An installation that could not be reached cannot be told that it
could not be reached, so the report belongs in the local log that already
exists. Left unset it writes to Console.Error; silence is a callback that says
nothing.
Disposal flushes, with a deadline. Dispose/DisposeAsync spends up to
FlushTimeout delivering what is still queued, and reports how many entries were
still waiting when the time ran out. What does not go in that time is lost —
which is what fire-and-forget means.
Settings
| default | ||
|---|---|---|
Installation |
required | scheme and host of the installation |
IngestToken |
required | the project's ingest token; write-only, grants no reads |
QueueCapacity |
10_000 |
ten full batches; oldest dropped when full |
BatchInterval |
1s |
how long the first entry waits for company |
FlushTimeout |
5s |
how long disposal keeps trying |
DeliveryTimeout |
10s |
how long one request may take |
OnFailure |
Console.Error |
(message, exception) — where problems are reported |
The batch limits — a thousand entries, five mebibytes — are product values rather than sender settings, and are applied for you.
An overload takes your own HttpClient when the application manages its own.
The format
One JSON object per line. @t (an instant with an offset or Z) and @mt (a
message template) are required; @l defaults to Information; @x carries an
exception as text. Everything not beginning with @ is a property.
The server renders the template, so @m is refused rather than ignored —
there is one place where rendering happens. Placeholders are substituted only
where a property of the same name was delivered; everything else stays character
for character, because log content is untrusted and an application logging a raw
request body will eventually log braces.
instance, SourceContext, TraceId and SpanId are ordinary properties that
the installation promotes to indexed fields when present. Supplying none of them
is fully supported.
Full detail: docs/ingestion.md.
Requirements
.NET 8 or later. MIT licensed.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Logaffe.Client:
| Package | Downloads |
|---|---|
|
Logaffe.Serilog
A Serilog sink delivering to a logaffe installation. Because the wire format is CLEF, the sink is configuration rather than a mapping layer. |
|
|
Logaffe.Extensions.Logging
An ILoggerProvider delivering to a logaffe installation, for applications that are not on Serilog. It builds the same CLEF from ILogger's message template and state. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.9.0 | 121 | 9/6/2026 |
| 0.8.0 | 124 | 9/6/2026 |
| 0.7.1 | 129 | 9/6/2026 |
| 0.7.0 | 122 | 9/6/2026 |
| 0.6.0 | 1,223 | 8/23/2026 |
| 0.5.0 | 290 | 8/23/2026 |
| 0.4.0 | 138 | 8/20/2026 |
| 0.3.0 | 134 | 8/19/2026 |
| 0.2.8 | 131 | 8/19/2026 |
| 0.2.7 | 127 | 8/19/2026 |
| 0.2.6 | 138 | 8/19/2026 |
| 0.2.5 | 141 | 8/19/2026 |
| 0.2.4 | 151 | 8/19/2026 |
| 0.2.3 | 418 | 8/19/2026 |
| 0.2.2 | 127 | 8/18/2026 |
| 0.2.1 | 129 | 8/17/2026 |
| 0.2.0 | 133 | 8/17/2026 |
| 0.1.1 | 152 | 8/13/2026 |
| 0.1.0 | 131 | 8/13/2026 |
| 0.1.0-alpha.1 | 71 | 8/13/2026 |