CSharpEssentials.LoggerHelper
1.2.2
See the version list below for details.
dotnet add package CSharpEssentials.LoggerHelper --version 1.2.2
NuGet\Install-Package CSharpEssentials.LoggerHelper -Version 1.2.2
<PackageReference Include="CSharpEssentials.LoggerHelper" Version="1.2.2" />
<PackageVersion Include="CSharpEssentials.LoggerHelper" Version="1.2.2" />
<PackageReference Include="CSharpEssentials.LoggerHelper" />
paket add CSharpEssentials.LoggerHelper --version 1.2.2
#r "nuget: CSharpEssentials.LoggerHelper, 1.2.2"
#addin nuget:?package=CSharpEssentials.LoggerHelper&version=1.2.2
#tool nuget:?package=CSharpEssentials.LoggerHelper&version=1.2.2
๐ฆ CSharpEssentials.LoggerHelper
Introduction
LoggerHelper
is a library designed to simplify, standardize, and enhance logging management in .NET applications, using Serilog as the core engine.
It allows you to:
- Send structured logs with guaranteed fields like
Action
,IdTransaction
,ApplicationName
,MachineName
- Dynamically enable multi-sink support (Console, File, HTML Email, PostgreSQL, ElasticSearch)
- Automatically validate message
{}
placeholders - Centralize configuration through LoggerBuilder, just by editing the appsettings.json file
In common usage scenarios, it is advisable to avoid logging
Information
level events to sinks like Telegram, MSSQL, or PostgreSQL. This practice prevents issues such as HTTP 429 (rate limits) on Telegram and reduces risks of deadlocks or insufficient storage in database systems.
๐ Table of Contents
- โจ Features
- ๐ Installation
- โ๏ธ Configuration
- ๐ Log Levels
- ๐งช ASP.NET Core Setup
- ๐งโ๐ป Usage Examples
- ๐งฌ Database Schema
- ๐ Demo API
- ๐ Contributing
- ๐ License
- ๐ค Author
โจ Features
โ Multi-sink logging support:
- Console
- File
- SQL Server
- PostgreSQL
- Elasticsearch
- Telegram
โ Structured logs with custom properties
โ Sync and async logging
โ Request/response middleware logger
โ Transaction ID, action, machine name
โ Custom levels per sink
โ JSON configuration via
appsettings.LoggerHelper.json
๐ Installation
dotnet add package CSharpEssentials.LoggerHelper
โ๏ธ Configuration
Create a file named appsettings.LoggerHelper.json
in your project root:
{
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Debug",
"System": "Debug"
}
},
"SerilogConfiguration": {
"ApplicationName": "TestApp",
"SerilogCondition": [
{"Sink": "ElasticSearch","Level": []},
{"Sink": "MSSqlServer","Level": []},
{"Sink": "Email","Level": []},
{"Sink": "PostgreSQL","Level": ["Information","Warning","Error","Fatal"]},
{"Sink": "Telegram","Level": []},
{"Sink": "Console","Level": [ "Information" ]},
{"Sink": "File","Level": ["Information","Warning","Error","Fatal"]}
],
"SerilogOption": {
"File": {
"Path": "D:\\Logs\\ServerDemo",
"RollingInterval": "Day",
"RetainedFileCountLimit": 7,
"Shared": true
},
"TelegramOption": {
"chatId": "xxxxx",
"Api_Key": "sssss:ttttttttt"
},
"PostgreSQL": {
"connectionString": "<YOUR CONNECTIONSTRING>",
"tableName": "public",
"schemaName": "dbo",
"needAutoCreateTable": true
},
"ElasticSearch": {
"nodeUris": "http://10.0.1.119:9200",
"indexFormat": "PixeloApp"
},
"Email": {
"From": "<Email Alert>",
"Port": 587,
"Host": "<Host EMail>",
"To": [ "recipient#1", "recipient#2" ],
"CredentialHost": "<UserName SMTP>",
"CredentialPassword": "<Password SMTP>"
},
"MSSqlServer": {
"connectionString": "<YOUR CONNECTIONSTRING>",
"sinkOptionsSection": {
"tableName": "logs",
"schemaName": "dbo",
"autoCreateSqlTable": true,
"batchPostingLimit": 100,
"period": "0.00:00:10"
},
"columnOptionsSection": {
"addStandardColumns": [
"LogEvent"
],
"removeStandardColumns": [
"Properties"
]
}
},
"GeneralConfig": {
"EnableSelfLogging": false
}
}
}
}
}
โ ๏ธ Important: The logger will only write to a sink if the
Level
array inSerilogCondition
contains at least one valid log level (e.g.,"Error"
,"Warning"
). If theLevel
array is empty (e.g.,"Level": []
), that sink will be ignored, andWriteTo
** will not be applied**, even if the sink configuration exists.๐งฉ PostgreSQL is preconfigured with a default column mapping for logs. The following columns are used automatically:
message
,message_template
,level
,raise_date
,exception
,properties
,props_test
,machine_name
. No custom mapping is required in the JSON.
๐ Log Levels
๐ผ๏ธ Example of a Telegram-formatted log message:
๐ฌ Telegram Notice: When using the Telegram sink, log messages are formatted for human readability, and may include emojis or markdown. For this reason, it's strongly recommended to set the
Level
to onlyError
orFatal
to avoid exceeding Telegram's rate limits and to prevent excessive message noise.
๐ Tip: Before publishing to production, test each sink you plan to use. You can enable Serilog self-logging to capture internal errors using:
Serilog.Debugging.SelfLog.Enable(msg => File.AppendAllText(Path.Combine(logPath, "serilog-selflog.txt"), msg));
Replace
logPath
with your local or shared log directory. This helps identify misconfigurations or sink loading issues early.
Each sink only receives log levels specified in the SerilogCondition
array. If a sink's Level
array is empty, that sink will be ignored entirely, and no log will be written to it, even if it's configured elsewhere:
Sink | Levels |
---|---|
Console | Information, Warning, Error, Fatal |
File | Error, Fatal |
PostgreSQL | Error, Fatal |
MSSqlServer | Error, Fatal |
Telegram | Fatal |
Elasticsearch | (disabled) |
๐งช ASP.NET Core Setup
Request/Response Logging Middleware
The LoggerHelper package includes a built-in middleware that logs every incoming HTTP request and outgoing response automatically. It captures:
- HTTP method, path, status code
- Request body (if available)
- Response body (if possible)
- Duration in milliseconds
To enable it, just call:
app.UseMiddleware<RequestResponseLoggingMiddleware>();
๐ This middleware uses
LogEventLevel.Information
by default and is automatically compatible with sinks that accept that level.
Register the logger in Program.cs
:
using CSharpEssentials.LoggerHelper;
var builder = WebApplication.CreateBuilder(args);
// Add LoggerHelper configuration
builder.Services.addloggerConfiguration(builder);
builder.Services.AddControllers();
var app = builder.Build();
// Logs every HTTP request and response
app.UseMiddleware<RequestResponseLoggingMiddleware>();
app.MapControllers();
app.Run();
๐งโ๐ป Usage Examples
๐น With request object
loggerExtension<MyRequest>.TraceSync(
request,
LogEventLevel.Information,
null,
"Operation successful: {OperationName}",
"CreateUser"
);
๐น Async logging
await loggerExtension<MyRequest>.TraceAsync(
request,
LogEventLevel.Error,
exception,
"Error during operation: {OperationName}",
"UpdateUser"
);
๐น Without request object
loggerExtension<IRequest>.TraceSync(
null,
LogEventLevel.Warning,
null,
"System warning: {WarningMessage}",
"Low disk space"
);
Database Schema
PostgreSQL
Column | Description |
---|---|
ApplicationName | Application name |
message | Message content |
message_template | Message template |
level | Log level |
raise_date | Log timestamp |
exception | Exception details |
properties | Serialized properties |
props_test | Additional serialized data |
MachineName | Machine name |
Action | Action name |
IdTransaction | Unique transaction ID |
SQL Server
Column | Type | Description |
---|---|---|
Message | nvarchar | Message content |
MessageTemplate | nvarchar | Message template |
Level | nvarchar | Log level |
TimeStamp | datetime | Log timestamp |
Exception | nvarchar | Exception details |
Properties | nvarchar | Serialized properties |
LogEvent | nvarchar | Serialized log event |
IdTransaction | varchar | Unique transaction ID |
MachineName | varchar | Machine name |
Action | varchar | Action name |
Swagger Example
Field | Description |
---|---|
action | Action name |
message | Text to log |
applicationName | Application name |
level | Log level (Information, Warning, Error, etc.) |
HTML Email Screenshot
Field | Value |
---|---|
Timestamp | 2025-05-10 17:45:00 |
Level | Error |
IdTransaction | 7e7b9f65-ed13-439a-852b-18d9d28dd6ec |
MachineName | PIXELO30 |
Action | GetUserDetails |
ApplicationName | LoggerHelperDemo |
Message | Error occurred during request |
Demo API
Try it live with a demo Web API to validate each log level dynamically:
Method | Endpoint | Query Parameters | Description |
---|---|---|---|
GET | /loggerHelper |
action , message , level |
Sends a structured log with the specified level |
๐งช Troubleshooting
File access denied?
โ If you get
System.IO.IOException
like: "file is being used by another process", make sure:- No other process (e.g. text editor, logging library) is locking the file.
- The file is not open in append-only exclusive mode.
โ For self-log output (
serilog-selflog.txt
), ensure that:- The target folder exists.
- The executing process has write permission to it.
- Use
FileShare.ReadWrite
if needed.
Sink not writing logs?
- โ
Make sure the
Level
array inSerilogCondition
is not empty. - โ
Check
serilog-selflog.txt
if enabled โ it often reveals silent misconfigurations.
๐ Contributing
Contributions, ideas and issues are welcome! Feel free to open a pull request or discussion on GitHub.
๐ License
This project is licensed under the MIT License.
๐ค Author
Alessandro Chiodo ๐ง GitHub ยท NuGet ยท LinkedIn ๐ฆ NuGet Package
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
- Microsoft.AspNetCore (>= 2.3.0)
- Microsoft.Extensions.Configuration (>= 9.0.4)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.1)
- Microsoft.Extensions.Configuration.Json (>= 9.0.1)
- Serilog (>= 4.2.0)
- Serilog.Settings.Configuration (>= 9.0.0)
- Serilog.Sinks.Console (>= 6.0.0)
- Serilog.Sinks.Elasticsearch (>= 10.0.0)
- Serilog.Sinks.Email (>= 4.1.0)
- Serilog.Sinks.MSSqlServer (>= 8.1.0)
- Serilog.Sinks.Postgresql.Alternative (>= 4.2.0)
- Serilog.Sinks.Telegram (>= 0.2.1)
NuGet packages (5)
Showing the top 5 NuGet packages that depend on CSharpEssentials.LoggerHelper:
Package | Downloads |
---|---|
CSharpEssentials.LoggerHelper.Sink.File
Sink File for package LoggerHelper |
|
CSharpEssentials.LoggerHelper.Sink.Postgresql
Package Description |
|
CSharpEssentials.LoggerHelper.Sink.MSSqlServer
Package Description |
|
CSharpEssentials.LoggerHelper.Sink.Elasticsearch
Sink ElasticSearch for CSharpEssentials.LoggerHelper |
|
CSharpEssentials.LoggerHelper.Sink.Console
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
3.0.6 | 90 | 2 days ago |
3.0.5 | 83 | 2 days ago |
3.0.4 | 116 | 4 days ago |
3.0.3 | 118 | 4 days ago |
3.0.2 | 234 | 6 days ago |
3.0.1 | 130 | 8 days ago |
3.0.0 | 140 | 8 days ago |
2.0.9 | 59 | 14 days ago |
2.0.8 | 94 | 15 days ago |
2.0.7 | 94 | 15 days ago |
2.0.6 | 128 | 19 days ago |
2.0.5 | 211 | 23 days ago |
2.0.4 | 237 | 25 days ago |
2.0.1 | 119 | a month ago |
2.0.0 | 120 | a month ago |
1.3.1 | 122 | a month ago |
1.2.3 | 69 | a month ago |
1.2.2 | 57 | a month ago |
1.2.1 | 102 | a month ago |
1.1.6 | 132 | a month ago |
1.1.5 | 151 | a month ago |
1.1.4 | 135 | a month ago |
1.1.3 | 140 | a month ago |
1.1.2 | 139 | a month ago |
1.1.1 | 131 | a month ago |
1.0.1 | 99 | 4 months ago |
1.0.0 | 94 | 4 months ago |