SyslogLogging 2.2.1
dotnet add package SyslogLogging --version 2.2.1
NuGet\Install-Package SyslogLogging -Version 2.2.1
<PackageReference Include="SyslogLogging" Version="2.2.1" />
<PackageVersion Include="SyslogLogging" Version="2.2.1" />
<PackageReference Include="SyslogLogging" />
paket add SyslogLogging --version 2.2.1
#r "nuget: SyslogLogging, 2.2.1"
#:package SyslogLogging@2.2.1
#addin nuget:?package=SyslogLogging&version=2.2.1
#tool nuget:?package=SyslogLogging&version=2.2.1
<img src="assets/logo.png" alt="SyslogLogging Logo" width="128" height="128" />
SyslogLogging
SyslogLogging is a C# logging library for syslog, console, and file destinations. It supports synchronous and asynchronous logging, structured log entries, Microsoft.Extensions.Logging integration, and file retention management.
Current release: 2.2.1
Target builds:
.NET Standard 2.0.NET Standard 2.1.NET Framework 4.6.2.NET Framework 4.8.NET 8.0.NET 10.0
Highlights
- RFC 3164 syslog output
- Console and file logging in the same logger
- Structured logging with
LogEntry - Fluent structured logging builder
Microsoft.Extensions.Loggingprovider and DI registration- Configurable header format tokens including
{app},{pid},{source}, and{correlation} - Configurable exception severity
- Automatic retention cleanup for dated log files
MessageLoggedevent for post-delivery notification of each emitted log entry- Shared Touchstone test coverage exposed through CLI, xUnit, and NUnit runners
What's New in 2.2.1
- Added the
MessageLoggedevent, raised once for each emitted log entry after it has been written to every configured destination. Handlers receive the original, unsplitLogEntryeven when the message was split for delivery, are invoked outside of any internal lock, and any handler exception is isolated and routed toOnLoggingErrorwithout interrupting logging. - Expanded shared Touchstone coverage with positive and negative
MessageLoggedscenarios across the sync and async paths.
Previously in 2.1.0
- Added
LoggingSettings.ApplicationNameso callers can explicitly control the{app}header token without changing the existing logging API. - Changed
{app}fallback resolution to useAssembly.GetEntryAssembly()?.GetName().Namebefore falling back to the current process name. - Fixed
.Exception()and.ExceptionAsync()so they honorLoggingSettings.ExceptionSeverity. - Fixed concurrent async file logging so writes are serialized correctly under load.
- Migrated tests to Touchstone shared suites with CLI, xUnit, and NUnit runners on
net8.0andnet10.0.
Installation
dotnet add package SyslogLogging
Quick Start
Simple Logging
using SyslogLogging;
LoggingModule log = new LoggingModule();
await log.InfoAsync("Hello, world!");
Syslog Logging
using SyslogLogging;
LoggingModule log = new LoggingModule("mysyslogserver", 514);
await log.WarnAsync("Rate limit exceeded");
File Logging
using SyslogLogging;
LoggingModule log = new LoggingModule("./logs/app.log", FileLoggingMode.SingleLogFile);
await log.InfoAsync("File-only message");
Structured Logging
LogEntry
LogEntry entry = new LogEntry(Severity.Error, "Payment processing failed")
.WithProperty("OrderId", orderId)
.WithProperty("Amount", amount)
.WithProperty("Currency", "USD")
.WithCorrelationId(correlationId)
.WithSource("PaymentService")
.WithException(exception);
await log.LogEntryAsync(entry);
Fluent Builder
await log.BeginStructuredLog(Severity.Info, "User login")
.WithProperty("UserId", userId)
.WithProperty("IpAddress", ipAddress)
.WithCorrelationId(correlationId)
.WriteAsync();
Microsoft.Extensions.Logging Integration
services.AddLogging(builder =>
{
builder.AddSyslog("syslogserver", 514);
});
Multiple syslog targets are also supported:
services.AddLogging(builder =>
{
builder.AddSyslog(new List<SyslogServer>
{
new SyslogServer("primary-log", 514),
new SyslogServer("backup-log", 514)
}, enableConsole: true);
});
Message Notifications
Subscribe to MessageLogged to observe each log entry after it has been delivered to all configured destinations. The handler receives the original LogEntry even when a long message is split into multiple parts for delivery, so the event fires exactly once per logged entry:
log.MessageLogged += entry =>
{
metrics.Increment("logs." + entry.Severity);
if (entry.Severity >= Severity.Error) alerting.Notify(entry);
};
await log.ErrorAsync("Payment gateway timeout");
Notes:
- The event is raised only for entries that pass
Settings.MinimumSeverity; filtered messages do not fire it. - Handlers are invoked outside of any internal lock, so a slow handler does not block other log writers, but it does run on the logging thread — keep handlers fast or hand off to your own queue.
- Exceptions thrown by a handler are isolated and routed to
OnLoggingError; they never interrupt logging or reach the caller.
Error Notifications
Subscribe to OnLoggingError to observe failures in the logging pipeline itself, such as file write or syslog delivery errors:
log.OnLoggingError += ex => Console.Error.WriteLine(ex);
Header Formatting
log.Settings.HeaderFormat = "{ts} {host}[{pid}] {sev} [T:{thread}] [{app}]";
log.Settings.ApplicationName = "MyService";
log.Settings.TimestampFormat = "yyyy-MM-dd HH:mm:ss.fff";
log.Settings.UseUtcTime = true;
Available header variables:
| Variable | Description | Example |
|---|---|---|
{ts} |
Timestamp | 2024-01-15 14:30:25.123 |
{host} |
Machine name | web-server-01 |
{thread} |
Thread ID | 12 |
{sev} |
Severity name | Info |
{level} |
Severity number | 6 |
{pid} |
Process ID | 1234 |
{user} |
Current username | john.doe |
{app} |
Application name | MyWebApp |
{domain} |
App domain | MyWebApp.exe |
{cpu} |
CPU core count | 8 |
{mem} |
Memory usage in MB | 256 |
{uptime} |
Process uptime | 02:45:30 |
{correlation} |
Correlation ID | abc-123-def |
{source} |
Log source | UserService |
{app} resolves in this order:
log.Settings.ApplicationNameAssembly.GetEntryAssembly()?.GetName().Name- Current process name
File Retention
LoggingModule log = new LoggingModule("./logs/app.log", FileLoggingMode.FileWithDate, true);
LoggingSettings settings = log.Settings;
settings.LogRetentionDays = 30;
log.Settings = settings;
Retention cleanup only applies when using FileLoggingMode.FileWithDate. The cleanup timer removes files matching the dated filename pattern when they are older than the configured retention period.
Testing
Run the shared Touchstone suite through the CLI runner:
dotnet run --project src/Test.Automated/Test.Automated.csproj -f net10.0
dotnet run --project src/Test.Automated/Test.Automated.csproj -f net8.0
Run the same shared descriptors through xUnit and NUnit:
dotnet test src/Test.Xunit/Test.Xunit.csproj
dotnet test src/Test.Nunit/Test.Nunit.csproj
The shared suite covers:
- Constructor and settings validation
- Severity helpers
- Structured and fluent logging APIs
- Exception severity behavior
- File output and retention cleanup
- Message ordering and concurrency
- Syslog delivery and error handling
Microsoft.Extensions.Loggingintegration
Related Project
The repository also includes SyslogServer, a simple utility application for receiving syslog traffic during development and testing.
Version History
See CHANGELOG.md for release details.
Help
File issues or feature requests at:
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. 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 is compatible. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.2
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- System.Text.Json (>= 8.0.5)
-
.NETFramework 4.8
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- System.Text.Json (>= 8.0.5)
-
.NETStandard 2.0
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- System.Text.Json (>= 8.0.5)
-
.NETStandard 2.1
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- System.Text.Json (>= 8.0.5)
-
net10.0
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
-
net8.0
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
NuGet packages (22)
Showing the top 5 NuGet packages that depend on SyslogLogging:
| Package | Downloads |
|---|---|
|
Omnicx.WebStore.Core
OmniCX WebStore Core contains the Controllers, API SDK and Models required to run the MVC Views of the WebStore. |
|
|
BigQ.dll
BigQ is a messaging platform using TCP sockets and websockets featuring sync, async, channel, and private communications. |
|
|
ContainerFS
Self-contained single-user file system written in C#. |
|
|
Less3
<3 Less3 is S3-compatible object storage that you can run on your laptop, server, or anywhere you like. |
|
|
LiteGraph
LiteGraph is a property graph database with support for graph relationships, tags, labels, metadata, data, and vectors. |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on SyslogLogging:
| Repository | Stars |
|---|---|
|
litegraphdb/litegraph
Lightweight graph database with relational, vector, and MCP support, designed to power knowledge and artificial intelligence persistence and retrieval.
|
|
|
jchristn/Less3
Less3 is an S3-compatible object storage server that runs on your laptop, servers, just about anywhere!
|
| Version | Downloads | Last Updated |
|---|---|---|
| 2.2.1 | 0 | 8/14/2026 |
| 2.2.0 | 0 | 8/14/2026 |
| 2.1.0 | 921 | 5/4/2026 |
| 2.0.13 | 3,100 | 12/28/2025 |
| 2.0.12 | 644 | 12/24/2025 |
| 2.0.11 | 6,318 | 10/7/2025 |
| 2.0.10 | 668 | 9/22/2025 |
| 2.0.9 | 264 | 9/22/2025 |
| 2.0.8 | 12,165 | 1/7/2025 |
| 2.0.7 | 5,545 | 12/23/2024 |
| 2.0.6 | 933 | 10/17/2024 |
| 2.0.5 | 775 | 9/10/2024 |
| 2.0.4 | 296 | 9/10/2024 |
| 2.0.3 | 298 | 9/10/2024 |
| 2.0.2 | 18,032 | 8/1/2023 |
| 2.0.1.8 | 10,457 | 10/6/2022 |
| 2.0.1.7 | 22,090 | 11/19/2021 |
| 2.0.1.6 | 1,626 | 11/12/2021 |
| 2.0.1.5 | 4,517 | 9/13/2021 |
| 2.0.1.4 | 25,484 | 5/20/2021 |
Added the MessageLogged event, fired once per emitted log entry after delivery to all destinations, with handler exceptions isolated to OnLoggingError