Jinget.Logger 6.2.0-preview010

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.0-preview010
                    
NuGet\Install-Package Jinget.Logger -Version 6.2.0-preview010
                    
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.0-preview010" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Jinget.Logger" Version="6.2.0-preview010" />
                    
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.0-preview010
                    
#r "nuget: Jinget.Logger, 6.2.0-preview010"
                    
#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.
#addin nuget:?package=Jinget.Logger&version=6.2.0-preview010&prerelease
                    
Install Jinget.Logger as a Cake Addin
#tool nuget:?package=Jinget.Logger&version=6.2.0-preview010&prerelease
                    
Install Jinget.Logger 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.

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 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. 
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.18 37 4/21/2025
8.0.17 43 4/21/2025
8.0.16 56 4/19/2025
8.0.15 185 4/13/2025
8.0.14 151 4/7/2025
8.0.13 136 4/7/2025
8.0.12 84 4/5/2025
8.0.11 188 3/9/2025
8.0.10 161 3/9/2025
8.0.9 168 3/9/2025
8.0.8 138 2/27/2025
8.0.7 100 2/27/2025
8.0.6 96 2/27/2025
8.0.5 98 2/26/2025
8.0.4 101 2/25/2025
8.0.3 95 2/24/2025
8.0.2 90 2/24/2025
8.0.1 123 2/20/2025
8.0.0 152 1/22/2025
8.0.0-preview013 193 12/19/2024
8.0.0-preview012 88 12/19/2024
8.0.0-preview011 87 12/17/2024
8.0.0-preview010 99 12/16/2024
8.0.0-preview009 82 12/15/2024
8.0.0-preview008 97 11/25/2024
8.0.0-preview007 134 11/11/2024
8.0.0-preview006 110 11/2/2024
8.0.0-preview005 83 11/2/2024
8.0.0-preview004 86 11/1/2024
8.0.0-preview003 91 11/1/2024
8.0.0-preview002 78 11/1/2024
8.0.0-preview001 77 11/1/2024
6.2.23-preview003 82 10/31/2024
6.2.23-preview002 82 10/31/2024
6.2.22 123 10/26/2024
6.2.21 100 10/26/2024
6.2.20 102 10/26/2024
6.2.19-preview037 84 10/14/2024
6.2.19-preview036 81 9/30/2024
6.2.19-preview035 104 9/10/2024
6.2.19-preview034 97 9/9/2024
6.2.19-preview033 101 9/1/2024
6.2.19-preview032 103 9/1/2024
6.2.19-preview031 101 8/31/2024
6.2.19-preview029 101 8/26/2024
6.2.19-preview028 115 8/26/2024
6.2.19-preview027 127 8/26/2024
6.2.19-preview026 126 8/21/2024
6.2.19-preview025 119 8/21/2024
6.2.19-preview024 114 8/19/2024
6.2.19-preview023 100 8/8/2024
6.2.19-preview022 109 8/8/2024
6.2.19-preview021 83 8/5/2024
6.2.19-preview020 74 8/5/2024
6.2.19-preview019 84 8/5/2024
6.2.19-preview018 62 8/3/2024
6.2.19-preview017 79 7/30/2024
6.2.19-preview016 88 7/29/2024
6.2.19-preview015 89 7/29/2024
6.2.19-preview014 96 7/26/2024
6.2.19-preview013 97 7/20/2024
6.2.19-preview012 89 7/20/2024
6.2.19-preview011 106 6/15/2024
6.2.19-preview010 98 6/14/2024
6.2.19-preview009 95 6/14/2024
6.2.19-preview008 97 6/13/2024
6.2.19-preview007 95 6/13/2024
6.2.19-preview006 94 6/13/2024
6.2.19-preview005 91 6/13/2024
6.2.19-preview004 95 6/13/2024
6.2.19-preview003 103 6/11/2024
6.2.19-preview002 99 6/8/2024
6.2.19-preview001 102 6/8/2024
6.2.18 146 6/6/2024
6.2.18-preview020 106 6/6/2024
6.2.18-preview019 107 6/6/2024
6.2.18-preview018 111 6/6/2024
6.2.18-preview017 109 6/2/2024
6.2.18-preview016 106 6/1/2024
6.2.18-preview015 109 5/28/2024
6.2.18-preview014 107 5/28/2024
6.2.18-preview013 107 5/28/2024
6.2.18-preview012 107 5/28/2024
6.2.18-preview011 111 5/26/2024
6.2.18-preview010 107 5/26/2024
6.2.18-preview009 110 5/26/2024
6.2.18-preview008 110 5/26/2024
6.2.18-preview007 128 5/22/2024
6.2.18-preview006 106 5/22/2024
6.2.18-preview005 119 5/19/2024
6.2.18-preview004 110 5/19/2024
6.2.18-preview003 109 5/19/2024
6.2.18-preview002 111 5/19/2024
6.2.17 137 5/19/2024
6.2.16 133 5/18/2024
6.2.15 131 5/18/2024
6.2.14 136 5/18/2024
6.2.13 132 5/17/2024
6.2.12 135 5/17/2024
6.2.11 136 5/17/2024
6.2.10 133 5/17/2024
6.2.9 112 5/12/2024
6.2.8 127 5/9/2024
6.2.7 118 5/9/2024
6.2.6 131 5/7/2024
6.2.5 133 4/24/2024
6.2.4 209 2/1/2024
6.2.1 139 1/23/2024
6.2.0 126 1/23/2024
6.2.0-preview013 104 1/19/2024
6.2.0-preview012 97 1/19/2024
6.2.0-preview011 101 1/18/2024
6.2.0-preview010 107 1/14/2024
6.2.0-preview009 112 1/11/2024
6.2.0-preview008 121 1/1/2024
6.2.0-preview007 96 1/1/2024
6.2.0-preview006 110 1/1/2024
6.2.0-preview005 118 1/1/2024
6.2.0-preview001 131 12/30/2023
6.1.0 232 12/2/2023
6.1.0-preview003 140 12/2/2023
6.1.0-preview002 116 12/2/2023
6.1.0-preview001 135 12/2/2023
6.0.2 162 11/27/2023
6.0.1 164 11/22/2023
6.0.0 160 11/22/2023
3.5.0 188 10/28/2023
3.4.0 162 10/1/2023
3.3.1 175 9/30/2023
3.3.0 170 9/28/2023
3.2.5 167 9/28/2023
3.2.4 150 9/28/2023
3.2.3 158 9/28/2023
3.2.2 151 9/28/2023
3.2.1 150 9/28/2023
3.2.0 178 9/28/2023
3.1.0 163 9/27/2023
3.0.1 167 9/27/2023
3.0.0 171 9/14/2023
3.0.0-preview001 150 9/14/2023