Asp. net Core 2.1 Logging - PullRequest
       7

Asp. net Core 2.1 Logging

3 голосов
/ 25 февраля 2020

Хочу разобраться с вопросом входа в систему asp. net cortex 2.1. Моя цель - зарегистрировать все критические ошибки, из-за которых сервер kestrel может сломаться. Как я понял из документации Microsoft.Extensions.Logging и Serilog, вам нужно создать регистратор на каждом контроллере и установить условия записи (например, try / catch). Есть ли более удобный способ регистрировать ЛЮБЫЕ критические ошибки в проекте из одного места? Я буду благодарен за любую помощь.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Вы можете создать Exception Middleware. Пожалуйста, ознакомьтесь с документацией о Middlewares

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Net;
using System.Threading.Tasks;

namespace API.Middlewares
{
    /// <summary>
    /// Custom Exception middleware to catch unhandled exception during runtime
    /// </summary>
    public class ExceptionMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<ExceptionMiddleware> _logger;

        public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger)
        {
            _logger = logger;
            _next = next;
        }

        public async Task InvokeAsync(HttpContext httpContext)
        {
            try
            {
                // next request in pipeline
                await _next(httpContext);
            }
            catch (Exception ex)
            {
                // Logs your each error
                _logger.LogError($"Something went wrong: {ex}");
                await HandleExceptionAsync(httpContext, ex);
            }
        }

        /// <summary>
        /// Handle runtime error
        /// </summary>
        /// <param name="context"></param>
        /// <param name="exception"></param>
        /// <returns></returns>
        private Task HandleExceptionAsync(HttpContext context, Exception exception)
        {
            // Customise it to handle more complex errors
            context.Response.ContentType = "application/json";
            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

            return context.Response.WriteAsync($"Something went wrong: {exception.Message}");
        }
    }
}

Затем добавьте его в Startup.cs

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            // Custom exception middleware
            app.UseMiddleware<ExceptionMiddleware>();;

            app.UseMvc();
        }

Согласно DOCS

Порядок добавления компонентов промежуточного программного обеспечения в метод Startup.Configure определяет порядок, в котором компоненты промежуточного программного обеспечения вызываются по запросам, и обратный порядок ответа.

Поэтому всегда добавляйте Exception Middleware в качестве своего первого Промежуточного программного обеспечения , чтобы оно могло перехватывать исключение из других Промежуточных программ также.

1 голос
/ 25 февраля 2020

Отличное руководство Net Обработка основных ошибок

Лямбда-обработчик исключений

Альтернативой странице обработчика пользовательских исключений является предоставление лямбда-выражения для UseExceptionHandler , Использование лямбды позволяет получить доступ к ошибке перед возвратом ответа.

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
   app.UseExceptionHandler(errorApp =>
   {
        errorApp.Run(async context =>
        {
            context.Response.StatusCode = 500;
            context.Response.ContentType = "text/html";

            await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
            await context.Response.WriteAsync("ERROR!<br><br>\r\n");

            var exceptionHandlerPathFeature = 
                context.Features.Get<IExceptionHandlerPathFeature>();

            // Use exceptionHandlerPathFeature to process the exception (for example, 
            // logging), but do NOT expose sensitive error information directly to 
            // the client.

            if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
            {
                await context.Response.WriteAsync("File error thrown!<br><br>\r\n");
            }

            await context.Response.WriteAsync("<a href=\"/\">Home</a><br>\r\n");
            await context.Response.WriteAsync("</body></html>\r\n");
            await context.Response.WriteAsync(new string(' ', 512)); // IE padding
        });
    });
    app.UseHsts();
}

Таким образом, вы можете вести свою регистрацию внутри лямды и отлавливать все исключения, выбрасываемые из веб-API.

Фильтры исключений

Фильтры исключений полезны для отслеживания исключений, возникающих в действиях MVC, но они не так гибки, как промежуточное ПО обработки исключений. Мы рекомендуем использовать промежуточное программное обеспечение. Используйте фильтры только в тех случаях, когда вам нужно по-разному обрабатывать ошибки, в зависимости от того, какое действие MVC выбрано.

Промежуточное ПО для пользовательских исключений

Уже упоминалось в других ответах. Довольно аккуратный гид здесь . Я только добавляю аккуратный способ добавить метод расширения как из коробки промежуточного программного обеспечения.

// Extension method used to add the middleware to the HTTP request pipeline.
public static class HttpStatusCodeExceptionMiddlewareExtensions
{
    public static IApplicationBuilder UseHttpStatusCodeExceptionMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<HttpStatusCodeExceptionMiddleware>();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...