Jinget.Logger 6.2.19-preview024

Prefix Reserved
This is a prerelease version of Jinget.Logger.
There is a newer version of this package available.
See the version list below for details.
dotnet add package Jinget.Logger --version 6.2.19-preview024
                    
NuGet\Install-Package Jinget.Logger -Version 6.2.19-preview024
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Jinget.Logger" Version="6.2.19-preview024" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Jinget.Logger" Version="6.2.19-preview024" />
                    
Directory.Packages.props
<PackageReference Include="Jinget.Logger" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Jinget.Logger --version 6.2.19-preview024
                    
#r "nuget: Jinget.Logger, 6.2.19-preview024"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Jinget.Logger@6.2.19-preview024
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Jinget.Logger&version=6.2.19-preview024&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Jinget.Logger&version=6.2.19-preview024&prerelease
                    
Install as a Cake Tool

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.

allowedLoglevels: Defines an array contains allowed log levels. If log's severity exists in this array, then it will be saved in elasticsearch otherwise it will be ignored. If this parameter not set, then all log levels will be allowed.

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. This address should not contains 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

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. foreach 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);
...

var elasticSearchSetting = new ElasticSearchSettingModel
{
    CreateIndexPerPartition = true,
    UserName = <authentication username>,
    Password = <authentication password>,
    Url = <ElasticSearch Url>,
    UseSsl = <true|false>
};
builder.Services.ConfigureElasticSearchLogger(elasticSearchSetting);

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.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();

When using partition key, index names will be constructed as below:

//for operation log
$"op.{partitionKey}".ToLower();

//for error log
$"err.{partitionKey}".ToLower();

//for custom log
$"cus.{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<OperationLog, ErrorLog, CustomLog>(blacklist);

var elasticSearchSetting = new ElasticSearchSettingModel
{
    UserName = "myuser",
    Password = "mypass",
    Url = "192.168.1.1:9200",
    UseSsl = false,
    RegisterDefaultLogModels = false,
    DiscoveryTypes = new List<Type> { typeof(OperationLog) }
};
builder.Services.ConfigureElasticSearchLogger<OperationLog, ErrorLog, CustomLog>(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
};
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.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.

allowedLoglevels: Defines an array contains allowed log levels. If log's severity exists in this array, then it will be saved in file otherwise it will be ignored. If this parameter not set, then all log levels will be allowed.

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 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 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.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.53 176 11/3/2025
8.0.52 179 10/13/2025
8.0.51 191 9/24/2025
8.0.50 192 9/11/2025
8.0.49 193 9/8/2025
8.0.48 182 9/8/2025
8.0.47 183 9/7/2025
8.0.46 129 8/22/2025
8.0.45 173 7/31/2025
8.0.44 150 7/31/2025
8.0.43 152 7/30/2025
8.0.42 157 7/30/2025
8.0.41 153 7/30/2025
8.0.40 150 7/30/2025
8.0.39 142 7/29/2025
8.0.38 152 7/28/2025
8.0.37 151 7/28/2025
8.0.36 161 7/28/2025
8.0.36-preview005 162 7/27/2025
8.0.35 118 7/19/2025
8.0.34 109 7/18/2025
8.0.33 190 6/29/2025
8.0.32 178 6/29/2025
8.0.31 131 6/28/2025
8.0.30 97 6/27/2025
8.0.29 106 6/27/2025
8.0.28 111 6/27/2025
8.0.27 151 6/27/2025
8.0.26 139 6/21/2025
8.0.25 193 6/15/2025
8.0.25-preview001 163 6/15/2025
8.0.24 207 5/31/2025
8.0.23 192 5/28/2025
8.0.23-preview001 176 5/28/2025
8.0.22 203 5/25/2025
8.0.21 212 5/11/2025
8.0.20 189 5/11/2025
8.0.19 186 5/11/2025
8.0.18 222 4/21/2025
8.0.17 215 4/21/2025
8.0.16 151 4/19/2025
8.0.15 258 4/13/2025
8.0.14 219 4/7/2025
8.0.13 209 4/7/2025
8.0.12 146 4/5/2025
8.0.11 249 3/9/2025
8.0.10 234 3/9/2025
8.0.9 240 3/9/2025
8.0.8 207 2/27/2025
8.0.7 167 2/27/2025
8.0.6 167 2/27/2025
8.0.5 166 2/26/2025
8.0.4 178 2/25/2025
8.0.3 162 2/24/2025
8.0.2 159 2/24/2025
8.0.1 194 2/20/2025
8.0.0 216 1/22/2025
8.0.0-preview013 242 12/19/2024
8.0.0-preview012 136 12/19/2024
8.0.0-preview011 136 12/17/2024
8.0.0-preview010 153 12/16/2024
8.0.0-preview009 133 12/15/2024
8.0.0-preview008 148 11/25/2024
8.0.0-preview007 183 11/11/2024
8.0.0-preview006 163 11/2/2024
8.0.0-preview005 136 11/2/2024
8.0.0-preview004 137 11/1/2024
8.0.0-preview003 147 11/1/2024
8.0.0-preview002 128 11/1/2024
8.0.0-preview001 129 11/1/2024
6.2.23-preview003 138 10/31/2024
6.2.23-preview002 133 10/31/2024
6.2.22 188 10/26/2024
6.2.21 154 10/26/2024
6.2.20 162 10/26/2024
6.2.19-preview037 137 10/14/2024
6.2.19-preview036 130 9/30/2024
6.2.19-preview035 154 9/10/2024
6.2.19-preview034 151 9/9/2024
6.2.19-preview033 152 9/1/2024
6.2.19-preview032 158 9/1/2024
6.2.19-preview031 149 8/31/2024
6.2.19-preview029 142 8/26/2024
6.2.19-preview028 162 8/26/2024
6.2.19-preview027 182 8/26/2024
6.2.19-preview026 177 8/21/2024
6.2.19-preview025 169 8/21/2024
6.2.19-preview024 165 8/19/2024
6.2.19-preview023 147 8/8/2024
6.2.19-preview022 164 8/8/2024
6.2.19-preview021 141 8/5/2024
6.2.19-preview020 127 8/5/2024
6.2.19-preview019 142 8/5/2024
6.2.19-preview018 112 8/3/2024
6.2.19-preview017 122 7/30/2024
6.2.19-preview016 134 7/29/2024
6.2.19-preview015 132 7/29/2024
6.2.19-preview014 146 7/26/2024
6.2.19-preview013 152 7/20/2024
6.2.19-preview012 138 7/20/2024
6.2.19-preview011 147 6/15/2024
6.2.19-preview010 141 6/14/2024
6.2.19-preview009 148 6/14/2024
6.2.19-preview008 149 6/13/2024
6.2.19-preview007 151 6/13/2024
6.2.19-preview006 151 6/13/2024
6.2.19-preview005 142 6/13/2024
6.2.19-preview004 145 6/13/2024
6.2.19-preview003 152 6/11/2024
6.2.19-preview002 149 6/8/2024
6.2.19-preview001 152 6/8/2024
6.2.18 214 6/6/2024
6.2.18-preview020 145 6/6/2024
6.2.18-preview019 150 6/6/2024
6.2.18-preview018 170 6/6/2024
6.2.18-preview017 157 6/2/2024
6.2.18-preview016 163 6/1/2024
6.2.18-preview015 157 5/28/2024
6.2.18-preview014 163 5/28/2024
6.2.18-preview013 148 5/28/2024
6.2.18-preview012 146 5/28/2024
6.2.18-preview011 169 5/26/2024
6.2.18-preview010 155 5/26/2024
6.2.18-preview009 167 5/26/2024
6.2.18-preview008 166 5/26/2024
6.2.18-preview007 180 5/22/2024
6.2.18-preview006 154 5/22/2024
6.2.18-preview005 173 5/19/2024
6.2.18-preview004 157 5/19/2024
6.2.18-preview003 161 5/19/2024
6.2.18-preview002 160 5/19/2024
6.2.17 202 5/19/2024
6.2.16 198 5/18/2024
6.2.15 201 5/18/2024
6.2.14 199 5/18/2024
6.2.13 203 5/17/2024
6.2.12 199 5/17/2024
6.2.11 204 5/17/2024
6.2.10 188 5/17/2024
6.2.9 173 5/12/2024
6.2.8 193 5/9/2024
6.2.7 175 5/9/2024
6.2.6 192 5/7/2024
6.2.5 199 4/24/2024
6.2.4 282 2/1/2024
6.2.1 204 1/23/2024
6.2.0 197 1/23/2024
6.2.0-preview013 146 1/19/2024
6.2.0-preview012 140 1/19/2024
6.2.0-preview011 139 1/18/2024
6.2.0-preview010 162 1/14/2024
6.2.0-preview009 160 1/11/2024
6.2.0-preview008 167 1/1/2024
6.2.0-preview007 145 1/1/2024
6.2.0-preview006 158 1/1/2024
6.2.0-preview005 164 1/1/2024
6.2.0-preview001 189 12/30/2023
6.1.0 280 12/2/2023
6.1.0-preview003 189 12/2/2023
6.1.0-preview002 163 12/2/2023
6.1.0-preview001 184 12/2/2023
6.0.2 210 11/27/2023
6.0.1 210 11/22/2023
6.0.0 214 11/22/2023
3.5.0 245 10/28/2023
3.4.0 216 10/1/2023
3.3.1 223 9/30/2023
3.3.0 214 9/28/2023
3.2.5 225 9/28/2023
3.2.4 205 9/28/2023
3.2.3 214 9/28/2023
3.2.2 210 9/28/2023
3.2.1 206 9/28/2023
3.2.0 238 9/28/2023
3.1.0 218 9/27/2023
3.0.1 217 9/27/2023
3.0.0 230 9/14/2023
3.0.0-preview001 207 9/14/2023