Jinget.Logger
8.0.0-preview002
Prefix Reserved
See the version list below for details.
dotnet add package Jinget.Logger --version 8.0.0-preview002
NuGet\Install-Package Jinget.Logger -Version 8.0.0-preview002
<PackageReference Include="Jinget.Logger" Version="8.0.0-preview002" />
paket add Jinget.Logger --version 8.0.0-preview002
#r "nuget: Jinget.Logger, 8.0.0-preview002"
// Install Jinget.Logger as a Cake Addin #addin nuget:?package=Jinget.Logger&version=8.0.0-preview002&prerelease // Install Jinget.Logger as a Cake Tool #tool nuget:?package=Jinget.Logger&version=8.0.0-preview002&prerelease
Jinget Logger
Using this library, you can easily save your application logs in Elasticsearch database or files, by calling logger.Logxxx methods.
How to Use:
Download the package from NuGet using Package Manager:
Install-Package Jinget.Logger
You can also use other methods supported by NuGet. Check Here for more information.
Configuration
Log to Elasticsearch:
LogToElasticSearch
: By calling this method, you are going to save your logs in Elasticsearch
builder.Host.LogToElasticSearch(blacklist);
blacklist
: Log messages contain the blacklist array items will not be logged.
minAllowedLoglevel
: Defines the minimum allowed log level. If log's severity is equal or greater than this value, then it will be saved in elasticsearch otherwise it will be ignored. If this parameter not set, then default log level will be applied(LogLevel.Information).
After setting the logging destination, you need to configure Elasticsearch:
builder.Services.ConfigureElasticSearchLogger(
new ElasticSearchSettingModel
{
CreateIndexPerPartition = <true|false>,
UserName = <authentication username>,
Password = <authentication password>,
Url = <ElasticSearch Url>,
UseSsl = <true|false>,
UseGlobalExceptionHandler = <true|false>,
Handle4xxResponses = <true|false>
});
Url
: Elasticsearch service url. This address should not contain the PROTOCOL itself. Use 'abc.com:9200' instead of 'http://abc.com:9200'
UserName
: Username, if basic authentication enabled on Elasticsearch search service
Password
: Password, if basic authentication enabled on Elasticsearch search service
UseSsl
: Set whether to use SSL while connecting to Elasticsearch or not
CreateIndexPerPartition
: Create index per partition using HttpContext.Items["jinget.log.partitionkey"] value. If this mode is selected, then index creation will be deferred until the first document insertion. foreach partition key, a separated index will be created. all the indexes will share the same data model.
RefreshType
: In Elasticsearch, the Index, Update, Delete, and Bulk APIs support setting refresh to control when changes made by this request are made visible to search.
UseGlobalExceptionHandler
: If set to true then global exception handler will be used which in turn will be rewrite the exception response output.
Handle4xxResponses
: If set to true then http request exception handler will be used which in turn will be handle the 4xx responses.
And finally you need to add the Jinget.Logger middleware to your pipeline:
app.UseJingetLogging();
If you are using partition key, then you need to set your partition key before calling app.UseJingetLogging()
. Like below:
app.UseWhen(p => elasticSearchSetting.CreateIndexPerPartition, appBuilder =>
{
appBuilder.Use(async (context, next) =>
{
//define the partitioning logic
bool partitionKeyExists = context.Request.Headers.TryGetValue("jinget.client_id", out StringValues partitionKey);
if (partitionKeyExists)
context.SetPartitionKey($"test.{partitionKey}");
await next.Invoke();
});
});
For example in the above code, logs will be partitioned based on the jinget.client_id
header's value. If this header does not exist in the request, the default index name will be used which are created using the following code:
$"{AppDomain.CurrentDomain.FriendlyName.ToLower()}";
When using partition key, index names will be constructed as below:
$"{AppDomain.CurrentDomain.FriendlyName.ToLower()}-{partitionKey.ToLower()}"
Here is the complete configuration for a .NET Web API application:
Without Partitioning:
using Jinget.Core.Filters;
using Jinget.Logger.Configuration;
using Jinget.Logger.Entities.Log;
var builder = WebApplication.CreateBuilder(args);
var config = new ConfigurationBuilder().AddJsonFile("appsettings.json", false, true).Build();
var blacklist = config.GetSection("logging:BlackList").Get<string[]>();
builder.Host.LogToElasticSearch(blacklist);
var elasticSearchSetting = new ElasticSearchSettingModel
{
UserName = "myuser",
Password = "mypass",
Url = "192.168.1.1:9200",
UseSsl = false,
UseGlobalExceptionHandler = true,
Handle4xxResponses = false
};
builder.Services.ConfigureElasticSearchLogger(elasticSearchSetting);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
var app = builder.Build();
app.UseJingetLogging();
app.MapControllers();
app.Run();
With Partitioning:
using Jinget.Core.Filters;
using Jinget.Logger.Configuration;
using Jinget.Logger.Configuration.Middlewares.ElasticSearch;
using Jinget.Logger.Entities.Log;
using Jinget.Logger.Handlers.CommandHandlers;
using Microsoft.Extensions.Primitives;
var builder = WebApplication.CreateBuilder(args);
var config = new ConfigurationBuilder().AddJsonFile("appsettings.json", false, true).Build();
var blacklist = config.GetSection("logging:BlackList").Get<string[]>();
builder.Host.LogToElasticSearch(blacklist);
var elasticSearchSetting = new ElasticSearchSettingModel
{
CreateIndexPerPartition = true,
UserName = "myuser",
Password = "mypass",
Url = "192.168.1.1:9200",
UseSsl = false,
UseGlobalExceptionHandler = true,
Handle4xxResponses = false
};
builder.Services.ConfigureElasticSearchLogger(elasticSearchSetting);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
var app = builder.Build();
app.UseWhen(p => elasticSearchSetting.CreateIndexPerPartition, appBuilder =>
{
appBuilder.Use(async (context, next) =>
{
bool partitionKeyExists = context.Request.Headers.TryGetValue("jinget.client_id", out StringValues partitionKey);
if (partitionKeyExists)
context.SetPartitionKey($"test.{partitionKey}");
await next.Invoke();
});
});
app.UseJingetLogging();
app.MapControllers();
app.Run();
Note: While logging data you might need to filter the request/response headers. In order to achieve this, you can use BlackListHeader
or WhiteListHeader
classes.
If Both of these classes used, then only BlackListHeader
will be applied.
To make use of these classes you can add them to DI container like below:
for black listed headers:(headers which you do NOT want to log)
builder.Services.Configure<BlackListHeader>(x => x.Headers = ["header1","header2"]);
Or for white listed headers:(headers which you want to log them ONLY)
builder.Services.Configure<WhiteListHeader>(x => x.Headers = ["header1","header2"]);
Log to File:
LogToFile
: By calling this method, you are going to save your logs in files
FileSettingModel fileSetting = new FileSettingModel
{
FileNamePrefix = "Log-",
LogDirectory = "D:\\Logs",
RetainFileCountLimit = 5,
FileSizeLimitMB = 10,
UseGlobalExceptionHandler = true,
Handle4xxResponses = true,
};
builder.Host.LogToFile(blacklist, fileSetting);
blacklist
: Log messages contain the blacklist array items will not be logged.
minAllowedLoglevel
: Defines the minimum allowed log level. Default log level is LogLevel.Information
.
FileNamePrefix
: Gets or sets the filename prefix to use for log files. Defaults is logs-
LogDirectory
: The directory in which log files will be written, relative to the app process. Default is Logs
directory.
RetainedFileCountLimit
: Gets or sets a strictly positive value representing the maximum retained file count or null for no limit. Defaults is 2 files.
FileSizeLimit
: Gets or sets a strictly positive value representing the maximum log size in MB or null for no limit. Once the log is full, no more messages will be appended. Defaults is 10MB
.
After setting the logging destination, you need to configure file logger:
builder.Services.ConfigureFileLogger(fileSetting);
Here is the complete configuration for a .NET Web API application:
using Jinget.Core.Filters;
using Jinget.Logger.Configuration;
var builder = WebApplication.CreateBuilder(args);
var config = new ConfigurationBuilder().AddJsonFile("appsettings.json", false, true).Build();
var blacklist = config.GetSection("logging:BlackList").Get<string[]>();
FileSettingModel fileSetting = new FileSettingModel
{
FileNamePrefix = "Log",
LogDirectory = "Logs",
RetainFileCountLimit = 5,
FileSizeLimitMB = 10,
UseGlobalExceptionHandler = true,
Handle4xxResponses = true,
};
builder.Host.LogToFile(blacklist, fileSetting);
builder.Services.ConfigureFileLogger(fileSetting);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
var app = builder.Build();
app.UseJingetLogging();
app.UseAuthorization();
app.MapControllers();
app.Run();
How to install
In order to install Jinget Logger please refer to nuget.org
Contact Me
👨💻 Twitter: https://twitter.com/_jinget
📧 Email: farahmandian2011@gmail.com
📣 Instagram: https://www.instagram.com/vahidfarahmandian
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. |
-
net8.0
- Jinget.Core (>= 8.0.0-preview002)
- Jinget.ExceptionHandler (>= 8.0.0-preview002)
- Mapster (>= 7.4.0)
- Microsoft.Extensions.Logging (>= 8.0.1)
- NEST (>= 7.17.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
8.0.0-preview008 | 62 | 11/25/2024 |
8.0.0-preview007 | 109 | 11/11/2024 |
8.0.0-preview006 | 88 | 11/2/2024 |
8.0.0-preview005 | 64 | 11/2/2024 |
8.0.0-preview004 | 68 | 11/1/2024 |
8.0.0-preview003 | 71 | 11/1/2024 |
8.0.0-preview002 | 61 | 11/1/2024 |
8.0.0-preview001 | 58 | 11/1/2024 |
6.2.23-preview003 | 67 | 10/31/2024 |
6.2.23-preview002 | 66 | 10/31/2024 |
6.2.22 | 91 | 10/26/2024 |
6.2.21 | 75 | 10/26/2024 |
6.2.20 | 79 | 10/26/2024 |
6.2.19-preview037 | 71 | 10/14/2024 |
6.2.19-preview036 | 69 | 9/30/2024 |
6.2.19-preview035 | 93 | 9/10/2024 |
6.2.19-preview034 | 85 | 9/9/2024 |
6.2.19-preview033 | 92 | 9/1/2024 |
6.2.19-preview032 | 92 | 9/1/2024 |
6.2.19-preview031 | 90 | 8/31/2024 |
6.2.19-preview029 | 90 | 8/26/2024 |
6.2.19-preview028 | 102 | 8/26/2024 |
6.2.19-preview027 | 105 | 8/26/2024 |
6.2.19-preview026 | 115 | 8/21/2024 |
6.2.19-preview025 | 107 | 8/21/2024 |
6.2.19-preview024 | 103 | 8/19/2024 |
6.2.19-preview023 | 89 | 8/8/2024 |
6.2.19-preview022 | 98 | 8/8/2024 |
6.2.19-preview021 | 69 | 8/5/2024 |
6.2.19-preview020 | 63 | 8/5/2024 |
6.2.19-preview019 | 72 | 8/5/2024 |
6.2.19-preview018 | 51 | 8/3/2024 |
6.2.19-preview017 | 66 | 7/30/2024 |
6.2.19-preview016 | 77 | 7/29/2024 |
6.2.19-preview015 | 77 | 7/29/2024 |
6.2.19-preview014 | 85 | 7/26/2024 |
6.2.19-preview013 | 84 | 7/20/2024 |
6.2.19-preview012 | 77 | 7/20/2024 |
6.2.19-preview011 | 95 | 6/15/2024 |
6.2.19-preview010 | 86 | 6/14/2024 |
6.2.19-preview009 | 84 | 6/14/2024 |
6.2.19-preview008 | 84 | 6/13/2024 |
6.2.19-preview007 | 81 | 6/13/2024 |
6.2.19-preview006 | 79 | 6/13/2024 |
6.2.19-preview005 | 78 | 6/13/2024 |
6.2.19-preview004 | 82 | 6/13/2024 |
6.2.19-preview003 | 89 | 6/11/2024 |
6.2.19-preview002 | 86 | 6/8/2024 |
6.2.19-preview001 | 89 | 6/8/2024 |
6.2.18 | 125 | 6/6/2024 |
6.2.18-preview020 | 93 | 6/6/2024 |
6.2.18-preview019 | 98 | 6/6/2024 |
6.2.18-preview018 | 98 | 6/6/2024 |
6.2.18-preview017 | 96 | 6/2/2024 |
6.2.18-preview016 | 90 | 6/1/2024 |
6.2.18-preview015 | 96 | 5/28/2024 |
6.2.18-preview014 | 91 | 5/28/2024 |
6.2.18-preview013 | 92 | 5/28/2024 |
6.2.18-preview012 | 92 | 5/28/2024 |
6.2.18-preview011 | 98 | 5/26/2024 |
6.2.18-preview010 | 94 | 5/26/2024 |
6.2.18-preview009 | 99 | 5/26/2024 |
6.2.18-preview008 | 95 | 5/26/2024 |
6.2.18-preview007 | 116 | 5/22/2024 |
6.2.18-preview006 | 95 | 5/22/2024 |
6.2.18-preview005 | 107 | 5/19/2024 |
6.2.18-preview004 | 99 | 5/19/2024 |
6.2.18-preview003 | 98 | 5/19/2024 |
6.2.18-preview002 | 102 | 5/19/2024 |
6.2.17 | 117 | 5/19/2024 |
6.2.16 | 109 | 5/18/2024 |
6.2.15 | 113 | 5/18/2024 |
6.2.14 | 115 | 5/18/2024 |
6.2.13 | 115 | 5/17/2024 |
6.2.12 | 117 | 5/17/2024 |
6.2.11 | 115 | 5/17/2024 |
6.2.10 | 114 | 5/17/2024 |
6.2.9 | 93 | 5/12/2024 |
6.2.8 | 109 | 5/9/2024 |
6.2.7 | 102 | 5/9/2024 |
6.2.6 | 116 | 5/7/2024 |
6.2.5 | 119 | 4/24/2024 |
6.2.4 | 194 | 2/1/2024 |
6.2.1 | 125 | 1/23/2024 |
6.2.0 | 113 | 1/23/2024 |
6.2.0-preview013 | 94 | 1/19/2024 |
6.2.0-preview012 | 86 | 1/19/2024 |
6.2.0-preview011 | 91 | 1/18/2024 |
6.2.0-preview010 | 97 | 1/14/2024 |
6.2.0-preview009 | 102 | 1/11/2024 |
6.2.0-preview008 | 108 | 1/1/2024 |
6.2.0-preview007 | 84 | 1/1/2024 |
6.2.0-preview006 | 95 | 1/1/2024 |
6.2.0-preview005 | 106 | 1/1/2024 |
6.2.0-preview001 | 120 | 12/30/2023 |
6.1.0 | 218 | 12/2/2023 |
6.1.0-preview003 | 129 | 12/2/2023 |
6.1.0-preview002 | 106 | 12/2/2023 |
6.1.0-preview001 | 125 | 12/2/2023 |
6.0.2 | 148 | 11/27/2023 |
6.0.1 | 150 | 11/22/2023 |
6.0.0 | 145 | 11/22/2023 |
3.5.0 | 174 | 10/28/2023 |
3.4.0 | 147 | 10/1/2023 |
3.3.1 | 161 | 9/30/2023 |
3.3.0 | 157 | 9/28/2023 |
3.2.5 | 154 | 9/28/2023 |
3.2.4 | 137 | 9/28/2023 |
3.2.3 | 146 | 9/28/2023 |
3.2.2 | 138 | 9/28/2023 |
3.2.1 | 138 | 9/28/2023 |
3.2.0 | 166 | 9/28/2023 |
3.1.0 | 151 | 9/27/2023 |
3.0.1 | 155 | 9/27/2023 |
3.0.0 | 156 | 9/14/2023 |
3.0.0-preview001 | 140 | 9/14/2023 |