using data.Domain.UseCase; using data.RemoteData.RemoteDataBase; using data.Repository; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; var builder = WebApplication.CreateBuilder(args); // Добавление контекста базы данных и репозиториев builder.Services.AddDbContext(); // Регистрируем репозитории и UseCase builder.Services.AddScoped() .AddScoped() .AddScoped() .AddScoped() .AddScoped(); // Добавление контроллеров builder.Services.AddControllers(); // Добавление Swagger для API документации builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // Добавляем логирование builder.Services.AddLogging(logging => { logging.ClearProviders(); logging.AddConsole(options => { options.LogToStandardErrorThreshold = LogLevel.Error; }); logging.AddDebug(); logging.SetMinimumLevel(LogLevel.Error); }); var app = builder.Build(); // Конфигурация Swagger UI для разработки if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } // Добавляем middleware для логирования любых ошибок app.UseMiddleware(); // Основные Middleware app.UseHttpsRedirection(); app.MapControllers(); app.Run(); public class ErrorLoggingMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public ErrorLoggingMiddleware(RequestDelegate next, ILogger logger) { _next = next; _logger = logger; } public async Task InvokeAsync(HttpContext context) { try { // Передача запроса дальше по конвейеру await _next(context); // Проверяем коды состояния и логируем ошибки 4xx и 5xx if (context.Response.StatusCode >= 400) { var logLevel = context.Response.StatusCode >= 500 ? LogLevel.Error : LogLevel.Warning; _logger.Log(logLevel, "Ответ с ошибкой: {StatusCode} для {Method} {Path}", context.Response.StatusCode, context.Request.Method, context.Request.Path); } } catch (Exception ex) { // Логируем необработанное исключение _logger.LogError(ex, "Необработанное исключение в запросе {Method} {Path}: {Message}", context.Request.Method, context.Request.Path, ex.Message); // Устанавливаем статус ответа context.Response.StatusCode = 500; await context.Response.WriteAsync("Произошла внутренняя ошибка сервера."); } } } // Пример контроллера для проверки всех ошибок [ApiController] [Route("api/[controller]")] public class TestController : ControllerBase { [HttpGet("bad-request")] public IActionResult BadRequestExample() { return BadRequest("Это пример ошибки 400."); } [HttpGet("internal-error")] public IActionResult InternalServerErrorExample() { throw new InvalidOperationException("Это пример необработанной ошибки."); } }