π View CerbiStream Benchmarks
Compare against Serilog, NLog, and others. CerbiStream is tuned for performance, governance, and enterprise-scale routing.
- Works with
ILogger<T>
- Structured logging enforcement
- Supports RabbitMQ, Kafka, Azure, AWS, GCP queues
- Flexible encryption (None, Base64, AES)
- Schema enforcement with GovernanceAnalyzer
- π Queue-first architecture (sink-agnostic)
- New presets:
BenchmarkMode()
,EnableDeveloperModeWithTelemetry()
- Toggle: telemetry, console, metadata, governance
- JSON conversion with encryption
- Queue routing using enums
dotnet add package CerbiStream
Optional governance analyzer:
dotnet add package CerbiStream.GovernanceAnalyzer
builder.Logging.AddCerbiStreamWithRouting(options =>
{
options.WithQueue("RabbitMQ", "localhost", "logs-queue")
.EnableDeveloperModeWithoutTelemetry()
.WithEncryptionMode(EncryptionType.Base64);
});
options.WithEncryptionMode(EncryptionType.AES)
.WithEncryptionKey(myKey, myIV);
Default (lazy) test keys:
var (key, iv) = EncryptionHelpers.GetInsecureDefaultKeyPair();
options.WithEncryptionKey(key, iv);
KeyVault example:
var key = Convert.FromBase64String(await secretClient.GetSecret("CerbiKey"));
var iv = Convert.FromBase64String(await secretClient.GetSecret("CerbiIV"));
Method | Description |
---|---|
EnableDeveloperModeWithTelemetry() |
Console + telemetry + metadata |
EnableDeveloperModeWithoutTelemetry() |
Console + metadata, no telemetry |
EnableDevModeMinimal() |
Console only |
EnableBenchmarkMode() |
Silent mode (no telemetry, queue, or console) |
Policy
.Handle<Exception>()
.WaitAndRetry(3, _ => TimeSpan.FromSeconds(1), (ex, _, attempt, _) =>
{
TelemetryContext.IsRetry = true;
TelemetryContext.RetryAttempt = attempt;
});
Option | Description |
---|---|
.WithQueue(...) |
Configure queue host, name, and type |
.DisableQueue() |
Stops sending logs to queues |
.WithTelemetryProvider() |
Set custom telemetry provider |
.IncludeSecurityMetadata() |
Adds IP/UserID info |
.EnableTelemetryLogging() |
Sends to telemetry even if queue is disabled |
Provider | Supported |
---|---|
OpenTelemetry | β |
Azure App Insights | β |
AWS CloudWatch | β |
GCP Trace | β |
Datadog | β |
var logger = new CerbiLoggerBuilder()
.UseAzureServiceBus("<conn>", "<queue>")
.EnableDebugMode()
.Build(logger, new ConvertToJson(), new NoOpEncryption());
var options = new CerbiStreamOptions()
.WithEncryptionMode(EncryptionType.Base64)
.WithQueue("RabbitMQ", "localhost", "logs");
builder.Logging.AddCerbiStreamWithRouting(options =>
{
options.WithQueue("AzureServiceBus", "sb://...", "queue")
.WithEncryptionMode(EncryptionType.AES);
});
var mockQueue = Substitute.For<IQueue>();
var logger = new Logging(Substitute.For<ILogger<Logging>>(), mockQueue, new ConvertToJson(), new NoOpEncryption());
var result = await logger.LogEventAsync("Test", LogLevel.Information);
Assert.True(result);
- RabbitMQ
- Kafka
- Azure Queue / Service Bus
- AWS SQS / Kinesis
- Google Pub/Sub
CerbiStream does not directly send logs to sinks like Splunk, Elastic, or Blob.
Instead:
- π Logs are emitted to queues only (Kafka, RabbitMQ, Azure, etc.)
- π§ CerbIQ reads from these queues and sends logs to sinks
- β Keeps log generation decoupled from log delivery
This design gives you:
- Better performance
- Retry-friendly resilience
- Pluggable downstream integrations
β‘οΈ Add CerbIQ to handle routing and sink delivery.
{
"LoggingProfiles": {
"SecurityLog": {
"RequiredFields": ["UserId", "IPAddress"],
"OptionalFields": ["DeviceType"]
}
}
}
MIT
Star the repo β β Contribute π§ β File issues π
Created by @Zeroshi