Files
EonaCat.Logger/Testers/EonaCat.Logger.Test.Web/Program.cs
2024-05-27 20:11:11 +02:00

233 lines
8.2 KiB
C#

using EonaCat.Logger;
using EonaCat.Logger.EonaCatCoreLogger;
using EonaCat.Logger.EonaCatCoreLogger.Extensions;
using EonaCat.Logger.EonaCatCoreLogger.Models;
using EonaCat.Logger.Managers;
using EonaCat.Logger.Test.Web;
using EonaCat.Web.RateLimiter;
using EonaCat.Web.RateLimiter.Endpoints.Extensions;
using EonaCat.Web.Tracer.Extensions;
var builder = WebApplication.CreateBuilder(args);
int onLogCounter = 0;
var defaultColor = Console.ForegroundColor;
// Add services to the container.
Logger logger = new Logger();
logger.UseLocalTime = true;
logger.MaxLogType = ELogType.TRACE;
logger.LoggerSettings.OnLog += LoggerSettings_OnLog;
void LoggerSettings_OnLog(EonaCatLogMessage message)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"LogCounter: {++onLogCounter} {message}");
Console.ForegroundColor = defaultColor;
}
var options = new FileLoggerOptions();
options.MaxRolloverFiles = 5;
//options.FileSizeLimit = 1 * 1024 * 1024 / 4;
options.UseLocalTime = true;
builder.Logging.AddEonaCatFileLogger(fileLoggerOptions: options, filenamePrefix: "web");
builder.Services.AddRazorPages();
//var rateLimitOptions = new RateLimitOptions
//{
// Capacity = 10,
// Duration = TimeSpan.FromMinutes(1)
//};
//builder.Services.AddRateLimiting(rateLimitOptions);
var rateOptions = new RateLimiterOptions();
rateOptions.OutputLimitMessageAsHtml = false;
rateOptions.OutputLimitMessageAsXml = false;
rateOptions.OutputLimitMessageAsJson = true;
rateOptions.AddDefaultConfiguration(config =>
config.AddIpResolver().AddRule(3, TimeSpan.FromSeconds(10))
);
RateLimiterMiddleware.OnLimitResponseCreated += RateLimiterMiddlewareOnLimitResponseCreatedAsync;
async void RateLimiterMiddlewareOnLimitResponseCreatedAsync(object? sender, HttpContext httpContext)
{
await httpContext.Response.WriteAsync(" THIS IS MY CUSTOM RATE LIMIT MESSAGE").ConfigureAwait(false);
}
//builder.Services.UseWebRateLimiter(rateOptions);
builder.Services.UseWebRateLimiter(rateOptions);
builder.Services.UseWebRateLimiter(rateOptions =>
{
// Configures the default rateLimitConfiguration
rateOptions.AddDefaultConfiguration(rateLimitConfiguration =>
{
// throttling is based on request ip
rateLimitConfiguration.AddIpResolver()
// add general rules for all ips
.AddRule(3, TimeSpan.FromSeconds(10)) // 3 requests could be called every 10 seconds
.AddRule(30, TimeSpan.FromMinutes(1)) // 30 requests could be called every 1 minute
.AddRule(500, TimeSpan.FromHours(1)); // 500 requests could be called every 1 hour
});
});
builder.Services.AddMemoryCache();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
//EonaCat.Web.RateLimiter.RateLimiterOptions options = new EonaCat.Web.RateLimiter.RateLimiterOptions();
//options.LimitMessage = "FUCKING NOOB!";
//options.WriteLimitMessageToResponse = true;
//options.WriteLimitMessageStatusCodeToResponse = true;
//app.UseRateLimiter(options);
//RateLimiterMiddleware.OnLimitResponseCreated += RateLimiterMiddleware_OnLimitResponseCreatedAsync;
//async void RateLimiterMiddleware_OnLimitResponseCreatedAsync(object? sender, HttpContext httpContext)
//{
// await httpContext.Response.WriteAsync("THIS IS MY CUSTOM RATE LIMIT MESSAGE");
//}
WebTracer.OnLog += WebTracer_OnLog;
void WebTracer_OnLog(object? sender, string e)
{
Console.WriteLine(e);
}
//app.UseWebTracer();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseWebRateLimiter();
app.MapRazorPages().RateLimit();
void RunLoggingExceptionTests()
{
var loggerSettings = new LoggerSettings();
loggerSettings.FileLoggerOptions.UseLocalTime = true;
loggerSettings.UseLocalTime = true;
loggerSettings.MaxLogType = ELogType.INFO;
var logger = new LogManager(loggerSettings);
for (var i = 0; i < 10; i++)
{
try
{
throw new Exception($"Normal Exception {i}");
}
catch (Exception exception)
{
logger.WriteAsync(exception).ConfigureAwait(false);
Console.WriteLine($"Normal ExceptionLogged: {i}");
}
Task.Delay(1);
}
}
await Task.Run(RunWebLoggerTestsAsync).ConfigureAwait(false);
await Task.Run(RunWebLoggingTests).ConfigureAwait(false);
await Task.Run(RunLoggingTestsAsync).ConfigureAwait(false);
await Task.Run(RunLoggingExceptionTests).ConfigureAwait(false);
await Task.Run(RunWebLoggingExceptionTests).ConfigureAwait(false);
void RunWebLoggingExceptionTests()
{
for (var i = 0; i < 10; i++)
{
try
{
throw new Exception($"WebException {i}");
}
catch (Exception exception)
{
app.Logger.LogCritical(exception, "CRITICAL");
app.Logger.LogDebug(exception, "DEBUG");
app.Logger.LogError(exception, "ERROR");
app.Logger.LogTrace(exception, "TRACE");
app.Logger.LogWarning(exception, "WARNING");
app.Logger.LogInformation(exception, "INFORMATION");
Console.WriteLine($"WebExceptionLogged: {i}");
}
Task.Delay(1);
}
}
async void RunWebLoggingTests()
{
if (!Directory.Exists(logger.LogFolder))
{
Directory.CreateDirectory(logger.LogFolder);
}
for (var i = 0; i < 9000000; i++)
{
app.Logger.LogInformation($"web-test {i}");
using (var file = new StreamWriter(Path.Combine(logger.LogFolder, "test.log"), true))
{
await file.WriteAsync($"WebLogged: {i}{Environment.NewLine}").ConfigureAwait(false);
}
Console.WriteLine($"WebLogged: {i}");
Task.Delay(1);
}
}
async Task RunLoggingTestsAsync()
{
var loggerSettings = new LoggerSettings();
loggerSettings.UseLocalTime = true;
loggerSettings.FileLoggerOptions.UseLocalTime = true;
loggerSettings.MaxLogType = ELogType.DEBUG;
loggerSettings.FileLoggerOptions.FileSizeLimit = 1024 * 1024 * 1;
loggerSettings.FileLoggerOptions.FileNamePrefix = "AllTypes";
loggerSettings.FileLoggerOptions.MaxRolloverFiles = 5;
var logger = new LogManager(loggerSettings);
for (var i = 0; i < 9000000; i++)
{
await logger.WriteAsync($"test to file {i} INFO").ConfigureAwait(false);
await logger.WriteAsync($"test to file {i} CRITICAL", ELogType.CRITICAL).ConfigureAwait(false);
await logger.WriteAsync($"test to file {i} DEBUG", ELogType.DEBUG).ConfigureAwait(false);
await logger.WriteAsync($"test to file {i} ERROR", ELogType.ERROR).ConfigureAwait(false);
await logger.WriteAsync($"test to file {i} TRACE", ELogType.TRACE).ConfigureAwait(false);
await logger.WriteAsync($"test to file {i} TRAFFIC", ELogType.TRAFFIC).ConfigureAwait(false);
await logger.WriteAsync($"test to file {i} WARNING", ELogType.WARNING).ConfigureAwait(false);
await logger.WriteAsync($"test to file {i} NONE", ELogType.NONE).ConfigureAwait(false);
Console.WriteLine($"Logged: {i}");
await Task.Delay(1).ConfigureAwait(false);
}
}
async Task RunWebLoggerTestsAsync()
{
var i = 0;
while (true)
{
i++;
await Task.Run(async () =>
{
await logger.LogAsync($"test via logger {i} INFO").ConfigureAwait(false);
await logger.LogAsync($"test via logger {i} CRITICAL", ELogType.CRITICAL).ConfigureAwait(false);
await logger.LogAsync($"test via logger {i} DEBUG", ELogType.DEBUG).ConfigureAwait(false);
await logger.LogAsync($"test via logger {i} ERROR", ELogType.ERROR).ConfigureAwait(false);
await logger.LogAsync($"test via logger {i} TRACE", ELogType.TRACE).ConfigureAwait(false);
await logger.LogAsync($"test via logger {i} TRAFFIC", ELogType.TRAFFIC).ConfigureAwait(false);
await logger.LogAsync($"test via logger {i} WARNING", ELogType.WARNING).ConfigureAwait(false);
await logger.LogAsync($"test via logger {i} NONE", ELogType.NONE).ConfigureAwait(false);
}).ConfigureAwait(false);
await Task.Delay(1).ConfigureAwait(false);
}
}
app.Run();