SyslogLogging 2.0.13
dotnet add package SyslogLogging --version 2.0.13
NuGet\Install-Package SyslogLogging -Version 2.0.13
<PackageReference Include="SyslogLogging" Version="2.0.13" />
<PackageVersion Include="SyslogLogging" Version="2.0.13" />
<PackageReference Include="SyslogLogging" />
paket add SyslogLogging --version 2.0.13
#r "nuget: SyslogLogging, 2.0.13"
#:package SyslogLogging@2.0.13
#addin nuget:?package=SyslogLogging&version=2.0.13
#tool nuget:?package=SyslogLogging&version=2.0.13
<img src="assets/logo.png" alt="SyslogLogging Logo" width="128" height="128" />
SyslogLogging
๐ Modern, high-performance C# logging library for syslog, console, and file destinations with async support, structured logging, and Microsoft.Extensions.Logging integration.
Targeted to .NET Standard 2.0+, .NET Framework 4.6.2+, .NET 6.0+, and .NET 8.0.
โจ What's New in v2.0.9+
๐ฅ Major New Features
- ๐ช๏ธ Full async support with
CancellationTokenthroughout - ๐ Structured logging with properties, correlation IDs, and JSON serialization
- ๐ Microsoft.Extensions.Logging integration (ILogger, DI support)
- ๐๏ธ Enterprise-grade thread safety with comprehensive race condition prevention
- ๐ฏ Integrated SyslogServer for end-to-end testing
- ๐ก๏ธ Comprehensive input validation on all public properties
- ๐งช Extensive thread safety testing (20+ specialized concurrent scenarios)
๐ง Performance & Reliability
- Thread-safe operations with proper locking mechanisms
- Immediate log delivery with direct processing
- Memory efficient with minimal overhead
- Standards compliant RFC 3164 syslog format support
๐ Quick Start
Simple Logging
using SyslogLogging;
LoggingModule log = new LoggingModule();
await log.InfoAsync("Hello, world!");
Async with Structured Data
using SyslogLogging;
LoggingModule log = new LoggingModule("mysyslogserver", 514);
// Simple async logging
await log.ErrorAsync("Something went wrong", cancellationToken);
// Structured logging with properties
LogEntry entry = new LogEntry(Severity.Warning, "Rate limit exceeded")
.WithProperty("RequestsPerSecond", 150)
.WithProperty("ClientId", "user123")
.WithCorrelationId(Request.Headers["X-Correlation-ID"]);
await log.LogEntryAsync(entry);
Fluent Structured Logging
log.BeginStructuredLog(Severity.Info, "User login")
.WithProperty("UserId", userId)
.WithProperty("IpAddress", ipAddress)
.WithProperty("Timestamp", DateTime.UtcNow)
.WithCorrelationId(correlationId)
.WriteAsync();
๐ Microsoft.Extensions.Logging Integration
ASP.NET Core / Generic Host
// Program.cs or Startup.cs
services.AddLogging(builder =>
{
builder.AddSyslog("syslogserver", 514);
});
// In your controllers/services
public class MyController : ControllerBase
{
private readonly ILogger<MyController> _logger;
public MyController(ILogger<MyController> logger)
{
_logger = logger;
}
public IActionResult Get()
{
_logger.LogInformation("API called with correlation {CorrelationId}",
HttpContext.TraceIdentifier);
return Ok();
}
}
Multiple Destinations
services.AddLogging(builder =>
{
builder.AddSyslog(new List<SyslogServer>
{
new SyslogServer("primary-log", 514),
new SyslogServer("backup-log", 514)
}, enableConsole: true);
});
๐ Advanced Structured Logging
Rich Metadata
LogEntry entry = new LogEntry(Severity.Error, "Payment processing failed")
.WithProperty("OrderId", orderId)
.WithProperty("Amount", amount)
.WithProperty("Currency", "USD")
.WithProperty("PaymentProvider", "Stripe")
.WithProperty("ErrorCode", errorCode)
.WithCorrelationId(correlationId)
.WithSource("PaymentService")
.WithException(exception);
await log.LogEntryAsync(entry);
JSON Serialization
LogEntry entry = new LogEntry(Severity.Info, "User session")
.WithProperty("SessionDuration", TimeSpan.FromMinutes(45))
.WithProperty("PagesVisited", new[] { "/home", "/products", "/checkout" });
string json = entry.ToJson();
// Output: {"timestamp":"2023-12-01T10:30:00.000Z","severity":"Info","message":"User session","threadId":1,"properties":{"SessionDuration":"00:45:00","PagesVisited":["/home","/products","/checkout"]}}
๐ฏ Multiple Destinations
Syslog + Console + File
List<SyslogServer> servers = new List<SyslogServer>
{
new SyslogServer("primary-syslog", 514),
new SyslogServer("backup-syslog", 514)
};
LoggingModule log = new LoggingModule(servers, enableConsole: true);
log.Settings.FileLogging = FileLoggingMode.FileWithDate; // Creates dated files
log.Settings.LogFilename = "./logs/app.log";
log.Alert("This goes to 2 syslog servers, console, AND file!");
File-Only Logging
LoggingModule log = new LoggingModule("./logs/app.log", FileLoggingMode.SingleLogFile);
await log.InfoAsync("File-only message");
Log Retention (Automatic Cleanup)
// Automatically delete log files older than 30 days
LoggingModule log = new LoggingModule("./logs/app.log", FileLoggingMode.FileWithDate, true);
LoggingSettings settings = log.Settings;
settings.LogRetentionDays = 30; // Keep 30 days of logs (0 = disabled, default)
log.Settings = settings; // Re-assign to start cleanup timer
// Or configure settings first
LoggingSettings settings = new LoggingSettings();
settings.LogFilename = "./logs/app.log";
settings.FileLogging = FileLoggingMode.FileWithDate;
settings.LogRetentionDays = 7; // Keep 7 days of logs
LoggingModule log = new LoggingModule();
log.Settings = settings;
Note: Log retention only applies when using FileLoggingMode.FileWithDate. The cleanup timer runs every 60 seconds and removes files matching the pattern filename.ext.yyyyMMdd that are older than the specified retention period.
๐จ Console Colors & Formatting
Enable Colors
log.Settings.EnableColors = true;
log.Settings.Colors.Error = new ColorScheme(ConsoleColor.Red, ConsoleColor.Black);
log.Settings.Colors.Warning = new ColorScheme(ConsoleColor.Yellow, ConsoleColor.Black);
Custom Message Format with Rich Variables
// Basic format
log.Settings.HeaderFormat = "{ts} [{sev}] {host}:{thread}";
// Detailed production format
log.Settings.HeaderFormat = "{ts} {host}[{pid}] {sev} [T:{thread}] [{app}]";
// Performance monitoring format
log.Settings.HeaderFormat = "{ts} {host} CPU:{cpu} MEM:{mem}MB UP:{uptime} {sev}";
// Microservices format
log.Settings.HeaderFormat = "{ts} [{app}:{pid}] {sev} [{correlation}] [{source}]";
log.Settings.TimestampFormat = "yyyy-MM-dd HH:mm:ss.fff";
log.Settings.UseUtcTime = true;
Available Header Format Variables
| Variable | Description | Example Output |
|---|---|---|
{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 (0-7) | 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 (MB) | 256 |
{uptime} |
Process uptime | 02:45:30 |
{correlation} |
Correlation ID | abc-123-def |
{source} |
Log source | UserService |
๐ง Configuration Examples
Production Configuration
LoggingModule log = new LoggingModule("prod-syslog", 514, enableConsole: false);
// Set appropriate filters
log.Settings.MinimumSeverity = Severity.Warning;
log.Settings.MaxMessageLength = 8192;
// Structured logging for analysis
await log.BeginStructuredLog(Severity.Info, "Application started")
.WithProperty("Version", Assembly.GetExecutingAssembly().GetName().Version)
.WithProperty("Environment", Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"))
.WithProperty("MachineName", Environment.MachineName)
.WriteAsync();
Development Configuration
LoggingModule log = new LoggingModule("localhost", 514, enableConsole: true);
// Immediate feedback for development
log.Settings.EnableColors = true;
log.Settings.MinimumSeverity = Severity.Debug;
// File logging for detailed debugging
log.Settings.FileLogging = FileLoggingMode.FileWithDate;
log.Settings.LogFilename = "./logs/debug.log";
High-Concurrency Configuration
LoggingModule log = new LoggingModule("logserver", 514, enableConsole: true);
// Thread-safe operations
log.Settings.EnableColors = true;
Task.Run(async () =>
{
while (true)
{
// Even rapid server changes are thread-safe
log.Servers = GetAvailableServers();
await Task.Delay(1000);
}
});
// Multiple threads can safely log concurrently
Parallel.For(0, 1000, i =>
{
log.Info($"Concurrent message from thread {Thread.CurrentThread.ManagedThreadId}: {i}");
});
๐งช Testing
Run the comprehensive test suite:
cd src/Test
dotnet run
The test program validates each library capability including:
- โ All constructor patterns and validation
- โ Sync and async logging methods
- โ Structured logging with properties and correlation IDs
- โ Comprehensive thread safety under concurrent load
- โ Multiple destination delivery (syslog + console + file)
- โ Error handling and edge cases
- โ Performance benchmarks
- โ SyslogServer integration and end-to-end testing
๐ค Help or Feedback
Found a bug or have a feature request? File an issue - we'd love to hear from you!
๐ Special Thanks
We'd like to extend a special thank you to those that have helped make this library better: @dev-jan @jisotalo
๐ Version History
Please refer to CHANGELOG.md for detailed version history.
โญ Star this repo if SyslogLogging has helped your project!
| 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 (19)
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
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.13 | 43 | 12/28/2025 |
| 2.0.12 | 189 | 12/24/2025 |
| 2.0.11 | 4,103 | 10/7/2025 |
| 2.0.10 | 474 | 9/22/2025 |
| 2.0.9 | 201 | 9/22/2025 |
| 2.0.8 | 7,155 | 1/7/2025 |
| 2.0.7 | 5,175 | 12/23/2024 |
| 2.0.6 | 814 | 10/17/2024 |
| 2.0.5 | 408 | 9/10/2024 |
| 2.0.4 | 240 | 9/10/2024 |
| 2.0.3 | 228 | 9/10/2024 |
| 2.0.2 | 14,674 | 8/1/2023 |
| 2.0.1.8 | 9,961 | 10/6/2022 |
| 2.0.1.7 | 21,914 | 11/19/2021 |
| 2.0.1.6 | 1,537 | 11/12/2021 |
| 2.0.1.5 | 4,454 | 9/13/2021 |
| 2.0.1.4 | 25,427 | 5/20/2021 |
| 2.0.1.3 | 4,685 | 3/11/2021 |
| 2.0.1.2 | 1,313 | 3/11/2021 |
| 2.0.1.1 | 1,268 | 3/10/2021 |
| 2.0.1 | 1,298 | 3/10/2021 |
| 1.3.2.7 | 9,033 | 12/2/2020 |
| 1.3.2.6 | 2,961 | 11/23/2020 |
| 1.3.2.5 | 2,325 | 11/15/2020 |
| 1.3.2.4 | 1,606 | 11/6/2020 |
| 1.3.2.3 | 5,670 | 9/10/2020 |
| 1.3.2.2 | 24,228 | 6/10/2020 |
| 1.3.2.1 | 9,466 | 5/8/2020 |
| 1.3.2 | 74,003 | 12/3/2019 |
| 1.3.1 | 11,760 | 10/27/2019 |
| 1.3.0 | 1,437 | 10/7/2019 |
| 1.2.1 | 4,559 | 9/21/2019 |
| 1.2.0 | 2,506 | 8/10/2019 |
| 1.1.0 | 805,734 | 7/30/2019 |
| 1.0.12 | 1,469 | 7/6/2019 |
| 1.0.11 | 1,577 | 6/12/2019 |
| 1.0.10 | 5,834 | 3/10/2019 |
| 1.0.9 | 17,837 | 9/11/2017 |
| 1.0.8 | 6,880 | 12/12/2016 |
Added async support, structured logging, background queuing, and Microsoft.Extensions.Logging integration