8000 feat: add Zamin.Utilities.Sinks.Elasticsearch by danialygt · Pull Request #113 · oroumand/Zamin · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

feat: add Zamin.Utilities.Sinks.Elasticsearch #113

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: DotNet8
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Microsoft.AspNetCore.Mvc;

namespace Zamin.Utilities.Sinks.Elasticsearch.Sample.Controllers;

[ApiController]
[Route("[controller]")]
public class WeatherForecastController(ILogger<WeatherForecastController> logger) : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
logger.LogInformation("Log from Action Body");

return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using Serilog;
using Zamin.Extensions.DependencyInjection;

namespace Zamin.Utilities.Sinks.Elasticsearch.Sample;

public static class HostingExtensions
{
public static WebApplication ConfigureServices(this WebApplicationBuilder builder)
{
builder.Services.AddControllers();

builder.Services.AddZaminWebUserInfoService(c =>
{
c.DefaultUserId = "1";
}, true);

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();

return builder.Build();
}

public static WebApplication ConfigurePipeline(this WebApplication app)
{
app.UseSerilogRequestLogging();

if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

return app;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Zamin.Extensions.DependencyInjection;
using Zamin.Utilities.SerilogRegistration.Extensions;
using Zamin.Utilities.Sinks.Elasticsearch.Sample;

SerilogExtensions.RunWithSerilogExceptionHandling(() =>
{
var builder = WebApplication.CreateBuilder(args);

var app = builder.AddZaminSerilog(c =>
{
c.ApplicationName = "SinksElasticsearch";
c.ServiceName = "SampleService";
c.ServiceVersion = "1.0";
c.ServiceId = Guid.NewGuid().ToString();
})
.ConfigureServices()
.ConfigurePipeline();

app.Run();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:27391",
"sslPort": 44384
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5068",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7134;http://localhost:5068",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Zamin.Utilities.Sinks.Elasticsearch.Sample;

public class WeatherForecast
{
public DateTime Date { get; set; }

public int TemperatureC { get; set; }

public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

public string? Summary { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" />
<PackageReference Include="Zamin.Extensions.UsersManagement" Version="8.0.0" />
<PackageReference Include="Zamin.Utilities.SerilogRegistration" Version="8.0.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Zamin.Utilities.Sinks.Elasticsearch\Zamin.Utilities.Sinks.Elasticsearch.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"AllowedHosts": "*",
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Zamin.Utilities.Sinks.Elasticsearch" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Information"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": { "path": "%TEMP%\\Logs\\SerilogLoggerFile.Log.txt" }
},
{
"Name": "ZaminElasticsearch",
"Args": {
"nodeUris": "https://localhost:9200",
"indexFormat": "zamin-elasticsearch-sink-sample-index-{0:yyyy.MM}",
"restrictedToMinimumLevel": "Information",
"autoRegisterTemplate": true,
"autoRegisterTemplateVersion": "ESv6",
"batchPostingLimit": 50,
"period": 2,
"inlineFields": true,
"bufferFileSizeLimitBytes": 5242880,
"bufferLogShippingInterval": 5000,
"bufferRetainedInvalidPayloadsLimitBytes": 5000,
"bufferFileCountLimit": 31,
"connectionTimeout": 5,
"emitEventFailure": "WriteToSelfLog",
"queueSizeLimit": "100000",
"connectionGlobalHeaders": "Authorization=Basic jasfADSFEdpYzplbGsdfFsvjLTFxYXodsfE",
"disableServerCertificateValidation": false
}
}
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35327.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Zamin.Utilities.Sinks.Elasticsearch", "Zamin.Utilities.Sinks.Elasticsearch\Zamin.Utilities.Sinks.Elasticsearch.csproj", "{EB2AD21F-EBBE-47CD-B1C5-A62C686968AA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Zamin.Utilities.Sinks.Elasticsearch.Sample", "Zamin.Utilities.Sinks.Elasticsearch.Sample\Zamin.Utilities.Sinks.Elasticsearch.Sample.csproj", "{07F49A57-968F-4252-AA48-25A21C6573AB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EB2AD21F-EBBE-47CD-B1C5-A62C686968AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB2AD21F-EBBE-47CD-B1C5-A62C686968AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB2AD21F-EBBE-47CD-B1C5-A62C686968AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB2AD21F-EBBE-47CD-B1C5-A62C686968AA}.Release|Any CPU.Build.0 = Release|Any CPU
{07F49A57-968F-4252-AA48-25A21C6573AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07F49A57-968F-4252-AA48-25A21C6573AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07F49A57-968F-4252-AA48-25A21C6573AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07F49A57-968F-4252-AA48-25A21C6573AB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A4EC7F0C-2C92-4C45-A040-0C170816DDFE}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
using Elasticsearch.Net;
using Serilog.Configuration;
using Serilog.Core;
using Serilog.Events;
using Serilog.Formatting;
using Serilog.Sinks.Elasticsearch;
using Serilog;
using System.Collections.Specialized;

namespace Zamin.Utilities.Sinks.Elasticsearch;

public static class LoggerConfigurationZaminElasticsearchExtensions
{
public static LoggerConfiguration ZaminElasticsearch(this LoggerSinkConfiguration loggerSinkConfiguration, ElasticsearchSinkOptions options = null)
{
return loggerSinkConfiguration.Elasticsearch(options);
}

public static LoggerConfiguration ZaminElasticsearch(this LoggerSinkConfiguration loggerSinkConfiguration,
string nodeUris,
string indexFormat = null,
string templateName = null,
string typeName = null,
int batchPostingLimit = 50,
int period = 2,
bool inlineFields = false,
LogEventLevel restrictedToMinimumLevel = LogEventLevel.Verbose,
string bufferBaseFilename = null,
long? bufferFileSizeLimitBytes = null,
long bufferLogShippingInterval = 5000L,
string connectionGlobalHeaders = null,
LoggingLevelSwitch levelSwitch = null,
int connectionTimeout = 5,
EmitEventFailureHandling emitEventFailure = EmitEventFailureHandling.WriteToSelfLog,
int queueSizeLimit = 100000,
string pipelineName = null,
bool autoRegisterTemplate = false,
AutoRegisterTemplateVersion? autoRegisterTemplateVersion = null,
bool overwriteTemplate = false,
RegisterTemplateRecovery registerTemplateFailure = RegisterTemplateRecovery.IndexAnyway,
string deadLetterIndexName = null,
int? numberOfShards = null,
int? numberOfReplicas = null,
IFormatProvider formatProvider = null,
IConnection connection = null,
IElasticsearchSerializer serializer = null,
IConnectionPool connectionPool = null,
ITextFormatter customFormatter = null,
ITextFormatter customDurableFormatter = null,
ILogEventSink failureSink = null,
long? singleEventSizePostingLimit = null,
int? bufferFileCountLimit = null,
Dictionary<string, string> templateCustomSettings = null,
ElasticOpType batchAction = ElasticOpType.Index,
bool detectElasticsearchVersion = true,
bool disableServerCertificateValidation = false)
{
if (string.IsNullOrEmpty(nodeUris))
{
throw new ArgumentNullException("nodeUris", "No Elasticsearch node(s) specified.");
}

IEnumerable<Uri> nodes = from uriString in nodeUris.Split(new char[2] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries)
select new Uri(uriString);
ElasticsearchSinkOptions elasticsearchSinkOptions = ((connectionPool == null) ? new ElasticsearchSinkOptions(nodes) : new ElasticsearchSinkOptions(connectionPool));
if (!string.IsNullOrWhiteSpace(indexFormat))
{
elasticsearchSinkOptions.IndexFormat = indexFormat;
}

if (!string.IsNullOrWhiteSpace(templateName))
{
elasticsearchSinkOptions.AutoRegisterTemplate = true;
elasticsearchSinkOptions.TemplateName = templateName;
}

elasticsearchSinkOptions.BatchPostingLimit = batchPostingLimit;
elasticsearchSinkOptions.BatchAction = batchAction;
elasticsearchSinkOptions.SingleEventSizePostingLimit = singleEventSizePostingLimit;
elasticsearchSinkOptions.Period = TimeSpan.FromSeconds(period);
elasticsearchSinkOptions.InlineFields = inlineFields;
elasticsearchSinkOptions.MinimumLogEventLevel = restrictedToMinimumLevel;
elasticsearchSinkOptions.LevelSwitch = levelSwitch;
if (!string.IsNullOrWhiteSpace(bufferBaseFilename))
{
Path.GetFullPath(bufferBaseFilename);
elasticsearchSinkOptions.BufferBaseFilename = bufferBaseFilename;
}

if (bufferFileSizeLimitBytes.HasValue)
{
elasticsearchSinkOptions.BufferFileSizeLimitBytes = bufferFileSizeLimitBytes.Value;
}

if (bufferFileCountLimit.HasValue)
{
elasticsearchSinkOptions.BufferFileCountLimit = bufferFileCountLimit.Value;
}

elasticsearchSinkOptions.BufferLogShippingInterval = TimeSpan.FromMilliseconds(bufferLogShippingInterval);
if (!string.IsNullOrWhiteSpace(connectionGlobalHeaders))
{
NameValueCollection headers = new NameValueCollection();
connectionGlobalHeaders.Split(new char[2] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries).ToList().ForEach(delegate (string headerValueStr)
{
string[] array = headerValueStr.Split(new char[1] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries);
headers.Add(array[0], array[1]);
});
elasticsearchSinkOptions.ModifyConnectionSettings = (ConnectionConfiguration c) =>
{
c.GlobalHeaders(headers);

if (disableServerCertificateValidation)
c.ServerCertificateValidationCallback((sender, certificate, chain, sslPolicyErrors) => true);

return c;
};
}

elasticsearchSinkOptions.ConnectionTimeout = TimeSpan.FromSeconds(connectionTimeout);
elasticsearchSinkOptions.EmitEventFailure = emitEventFailure;
elasticsearchSinkOptions.QueueSizeLimit = queueSizeLimit;
elasticsearchSinkOptions.PipelineName = pipelineName;
elasticsearchSinkOptions.AutoRegisterTemplate = autoRegisterTemplate;
elasticsearchSinkOptions.AutoRegisterTemplateVersion = autoRegisterTemplateVersion;
elasticsearchSinkOptions.RegisterTemplateFailure = registerTemplateFailure;
elasticsearchSinkOptions.OverwriteTemplate = overwriteTemplate;
elasticsearchSinkOptions.NumberOfShards = numberOfShards;
elasticsearchSinkOptions.NumberOfReplicas = numberOfReplicas;
if (!string.IsNullOrWhiteSpace(deadLetterIndexName))
{
elasticsearchSinkOptions.DeadLetterIndexName = deadLetterIndexName;
}

elasticsearchSinkOptions.FormatProvider = formatProvider;
elasticsearchSinkOptions.FailureSink = failureSink;
elasticsearchSinkOptions.Connection = connection;
elasticsearchSinkOptions.CustomFormatter = customFormatter;
elasticsearchSinkOptions.CustomDurableFormatter = customDurableFormatter;
elasticsearchSinkOptions.Serializer = serializer;
elasticsearchSinkOptions.TemplateCustomSettings = templateCustomSettings;
elasticsearchSinkOptions.DetectElasticsearchVersion = detectElasticsearchVersion;
return loggerSinkConfiguration.Elasticsearch(elasticsearchSinkOptions);
}
}
Loading
0