Jinget.Logger
6.2.0
Prefix Reserved
See the version list below for details.
dotnet add package Jinget.Logger --version 6.2.0
NuGet\Install-Package Jinget.Logger -Version 6.2.0
<PackageReference Include="Jinget.Logger" Version="6.2.0" />
paket add Jinget.Logger --version 6.2.0
#r "nuget: Jinget.Logger, 6.2.0"
// Install Jinget.Logger as a Cake Addin #addin nuget:?package=Jinget.Logger&version=6.2.0 // Install Jinget.Logger as a Cake Tool #tool nuget:?package=Jinget.Logger&version=6.2.0
Jinget Logger
Using this library, you can easily save your application logs in Elasticsearch database or files.
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
Config logging destination:
Elasticsearch:
LogToElasticSearch
: By calling this method, you are going to save your logs in Elasticsearch
builder.Host.LogToElasticSearch<OperationLog, ErrorLog, CustomLog>(blacklist);
blacklist
: Log messages contain the blacklist array items will not logged.
After setting the logging destination, you need to configure Elasticsearch:
builder.Services.ConfigureElasticSearchLogger<OperationLog, ErrorLog, CustomLog>(
new ElasticSearchSettingModel
{
UserName = <authentication username>,
Password = <authentication password>,
Url = <ElasticSearch Url>,
UseSsl = <true|false>,
RegisterDefaultLogModels = <true|false>,
DiscoveryTypes = new List<Type> { typeof(OperationLog) }
});
Url
: Elasticsearch service url. If authentication is enabled, this address should not contains the PROTOCOL itself. Use 'abc.com' instead of 'http://abc.com'
UserName
: Username, if authentication enabled on Elasticsearch service
Password
: Password, if authentication enabled on Elasticsearch service
UseSsl
: Use HTTP or HTTPS, if authentication enabled on Elasticsearch service.
RegisterDefaultLogModels
: You can configure logging using your own models instead of OperationLog
, ErrorLog
or CustomLog
. In order to do so, you can simple create derived types and use them instead of these types.
When you are working with your own custom types, if you want to create index for default log models, you can set the RegisterDefaultLogModels
property to true
, otherwise you can set it as false
.
DiscoveryTypes
: Foreach type specified in this list, an index in Elasticsearch will be created
CreateIndexPerPartition
: Create index per partition using HttpContext.Items["jinget.log.partitionkey"] value. If this mode is selected, then RegisterDefaultLogModels
and also DiscoveryTypes
will not be used. If this mode is selected, then index creation will be deferred until the first document insertion. foeach partition key, a separated index will be created. all of the indexes will share the same data model. for request/response logs, Entities.Log.OperationLog
will be used. for errors, Entities.Log.ErrorLog
will be used. for custom logs, Entities.Log.CustomLog
will be used.
If you want to use partition key, instead of predefined/custom models, then you do not need to pass the generic types. Just like below:
builder.Host.LogToElasticSearch(blacklist);
...
builder.Services.ConfigureElasticSearchLogger(
new ElasticSearchSettingModel
{
CreateIndexPerPartition = true,
UserName = <authentication username>,
Password = <authentication password>,
Url = <ElasticSearch Url>,
UseSsl = <true|false>,
RegisterDefaultLogModels = <true|false>,
DiscoveryTypes = new List<Type> { typeof(OperationLog) }
});
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) =>
{
bool partitionKeyExists = context.Request.Headers.TryGetValue("jinget.client_id", out StringValues partitionKey);
if (partitionKeyExists)
context.Items.Add("jinget.log.partitionkey", $"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 exists in the request, the default index name will be used which are created using the following code:
$"{AppDomain.CurrentDomain.FriendlyName}.{typeof(TModelType).Name}".ToLower();
Here is the complete configuration for a .NET 7.0 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<OperationLog, ErrorLog, CustomLog>(blacklist);
builder.Services.ConfigureElasticSearchLogger<OperationLog, ErrorLog, CustomLog>(
new ElasticSearchSettingModel
{
UserName = "myuser",
Password = "mypass",
Url = "192.168.1.1:9200",
UseSsl = false,
RegisterDefaultLogModels = false,
DiscoveryTypes = new List<Type> { typeof(OperationLog) }
});
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);
builder.Services.ConfigureElasticSearchLogger(
new ElasticSearchSettingModel
{
CreateIndexPerPartition = true,
UserName = "myuser",
Password = "mypass",
Url = "192.168.1.1:9200",
UseSsl = false
});
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.Items.Add("jinget.log.partitionkey", $"test.{partitionKey}");
await next.Invoke();
});
});
app.UseJingetLogging();
app.MapControllers();
app.Run();
File:
LogToFile
: By calling this method, you are going to save your logs in files
builder.Host.LogToFile(blacklist, fileNamePrefix: "Log-", logDirectory: "D:\\logs", 10, 15);
blacklist
: Log messages contain the blacklist array items will not logged.
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 Elasticsearch:
builder.Services.ConfigureFileLogger();
Here is the complete configuration for a .NET 7.0 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[]>();
builder.Host.LogToFile(blacklist, "Log-", "D:\\logs", 10, 15);
builder.Services.ConfigureFileLogger();
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 | net6.0 is compatible. 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 was computed. 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. |
-
net6.0
- Jinget.Core (>= 6.2.0)
- Microsoft.Extensions.Logging (>= 8.0.0)
- 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-preview007 | 65 | 11/11/2024 |
8.0.0-preview006 | 76 | 11/2/2024 |
8.0.0-preview005 | 58 | 11/2/2024 |
8.0.0-preview004 | 65 | 11/1/2024 |
8.0.0-preview003 | 65 | 11/1/2024 |
8.0.0-preview002 | 58 | 11/1/2024 |
8.0.0-preview001 | 55 | 11/1/2024 |
6.2.23-preview003 | 64 | 10/31/2024 |
6.2.23-preview002 | 63 | 10/31/2024 |
6.2.22 | 85 | 10/26/2024 |
6.2.21 | 71 | 10/26/2024 |
6.2.20 | 75 | 10/26/2024 |
6.2.19-preview037 | 69 | 10/14/2024 |
6.2.19-preview036 | 67 | 9/30/2024 |
6.2.19-preview035 | 91 | 9/10/2024 |
6.2.19-preview034 | 83 | 9/9/2024 |
6.2.19-preview033 | 90 | 9/1/2024 |
6.2.19-preview032 | 90 | 9/1/2024 |
6.2.19-preview031 | 88 | 8/31/2024 |
6.2.19-preview029 | 88 | 8/26/2024 |
6.2.19-preview028 | 100 | 8/26/2024 |
6.2.19-preview027 | 103 | 8/26/2024 |
6.2.19-preview026 | 113 | 8/21/2024 |
6.2.19-preview025 | 105 | 8/21/2024 |
6.2.19-preview024 | 101 | 8/19/2024 |
6.2.19-preview023 | 87 | 8/8/2024 |
6.2.19-preview022 | 96 | 8/8/2024 |
6.2.19-preview021 | 67 | 8/5/2024 |
6.2.19-preview020 | 61 | 8/5/2024 |
6.2.19-preview019 | 70 | 8/5/2024 |
6.2.19-preview018 | 49 | 8/3/2024 |
6.2.19-preview017 | 64 | 7/30/2024 |
6.2.19-preview016 | 75 | 7/29/2024 |
6.2.19-preview015 | 75 | 7/29/2024 |
6.2.19-preview014 | 83 | 7/26/2024 |
6.2.19-preview013 | 82 | 7/20/2024 |
6.2.19-preview012 | 75 | 7/20/2024 |
6.2.19-preview011 | 93 | 6/15/2024 |
6.2.19-preview010 | 84 | 6/14/2024 |
6.2.19-preview009 | 81 | 6/14/2024 |
6.2.19-preview008 | 81 | 6/13/2024 |
6.2.19-preview007 | 78 | 6/13/2024 |
6.2.19-preview006 | 76 | 6/13/2024 |
6.2.19-preview005 | 75 | 6/13/2024 |
6.2.19-preview004 | 79 | 6/13/2024 |
6.2.19-preview003 | 86 | 6/11/2024 |
6.2.19-preview002 | 83 | 6/8/2024 |
6.2.19-preview001 | 86 | 6/8/2024 |
6.2.18 | 121 | 6/6/2024 |
6.2.18-preview020 | 90 | 6/6/2024 |
6.2.18-preview019 | 95 | 6/6/2024 |
6.2.18-preview018 | 95 | 6/6/2024 |
6.2.18-preview017 | 93 | 6/2/2024 |
6.2.18-preview016 | 87 | 6/1/2024 |
6.2.18-preview015 | 93 | 5/28/2024 |
6.2.18-preview014 | 88 | 5/28/2024 |
6.2.18-preview013 | 89 | 5/28/2024 |
6.2.18-preview012 | 89 | 5/28/2024 |
6.2.18-preview011 | 96 | 5/26/2024 |
6.2.18-preview010 | 92 | 5/26/2024 |
6.2.18-preview009 | 97 | 5/26/2024 |
6.2.18-preview008 | 93 | 5/26/2024 |
6.2.18-preview007 | 114 | 5/22/2024 |
6.2.18-preview006 | 93 | 5/22/2024 |
6.2.18-preview005 | 105 | 5/19/2024 |
6.2.18-preview004 | 97 | 5/19/2024 |
6.2.18-preview003 | 96 | 5/19/2024 |
6.2.18-preview002 | 100 | 5/19/2024 |
6.2.17 | 115 | 5/19/2024 |
6.2.16 | 107 | 5/18/2024 |
6.2.15 | 111 | 5/18/2024 |
6.2.14 | 113 | 5/18/2024 |
6.2.13 | 113 | 5/17/2024 |
6.2.12 | 115 | 5/17/2024 |
6.2.11 | 113 | 5/17/2024 |
6.2.10 | 112 | 5/17/2024 |
6.2.9 | 91 | 5/12/2024 |
6.2.8 | 107 | 5/9/2024 |
6.2.7 | 100 | 5/9/2024 |
6.2.6 | 114 | 5/7/2024 |
6.2.5 | 117 | 4/24/2024 |
6.2.4 | 192 | 2/1/2024 |
6.2.1 | 123 | 1/23/2024 |
6.2.0 | 111 | 1/23/2024 |
6.2.0-preview013 | 92 | 1/19/2024 |
6.2.0-preview012 | 84 | 1/19/2024 |
6.2.0-preview011 | 87 | 1/18/2024 |
6.2.0-preview010 | 95 | 1/14/2024 |
6.2.0-preview009 | 100 | 1/11/2024 |
6.2.0-preview008 | 106 | 1/1/2024 |
6.2.0-preview007 | 82 | 1/1/2024 |
6.2.0-preview006 | 91 | 1/1/2024 |
6.2.0-preview005 | 104 | 1/1/2024 |
6.2.0-preview001 | 118 | 12/30/2023 |
6.1.0 | 216 | 12/2/2023 |
6.1.0-preview003 | 127 | 12/2/2023 |
6.1.0-preview002 | 104 | 12/2/2023 |
6.1.0-preview001 | 123 | 12/2/2023 |
6.0.2 | 146 | 11/27/2023 |
6.0.1 | 148 | 11/22/2023 |
6.0.0 | 141 | 11/22/2023 |
3.5.0 | 172 | 10/28/2023 |
3.4.0 | 145 | 10/1/2023 |
3.3.1 | 159 | 9/30/2023 |
3.3.0 | 155 | 9/28/2023 |
3.2.5 | 152 | 9/28/2023 |
3.2.4 | 135 | 9/28/2023 |
3.2.3 | 144 | 9/28/2023 |
3.2.2 | 136 | 9/28/2023 |
3.2.1 | 136 | 9/28/2023 |
3.2.0 | 164 | 9/28/2023 |
3.1.0 | 149 | 9/27/2023 |
3.0.1 | 153 | 9/27/2023 |
3.0.0 | 154 | 9/14/2023 |
3.0.0-preview001 | 138 | 9/14/2023 |