Какие есть способы вести лог всех ошибок приложения в ASP.NET Core?

236
23 ноября 2017, 00:29

Какие есть способы вести лог всех ошибок приложения в ASP.NET Core? Например хотелось бы сохранять все исключения со стеком вызова в текстовые файлы или типа того (автоматические, не в обработчике исключений). Если были получены некорректные данные в контроллере хотелось бы добавить информацию о некорректном запросе в лог.

В идеале хотелось бы иметь инструмент, который, например, присылал бы SMS с сообщением о том, что база данных не отвечает, интернет отвалился, пользователи присылают на конкретный метод конкретного контроллера не те данные и тд.

Answer 1

Добавьте в Startup Middleware:

public void Configure(IApplicationBuilder app)
{
    app.UseMiddleware<ExceptionHandlerMiddleware>();
}

В Middleware вы задаёте собственную обработку запросов перед выполнением и после выполнения, так же обработку ошибок.

Реализация ExceptionHandlerMiddleware (не забудьте зарегистрировать ILogger в контейнере):

public sealed class ExceptionHandlerMiddleware
{
    private readonly ILogger _logger;
    private readonly RequestDelegate _next;
    public ExceptionHandlerMiddleware(RequestDelegate next, ILogger logger)
    {
        _next = next;
        _logger = logger;
    }
    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception exp)
        {
            _logger.LogError(context, exp);
            await HandleExceptionAsync(context, exp.GetBaseException());
        }
    }
    private static Task HandleExceptionAsync(HttpContext context, Exception exp)
    {
        var code = HttpStatusCode.InternalServerError; // 500 if unexpected
        var result = JsonConvert.SerializeObject(new { Code = code, Message = exp.Message, StackTrace = exp.StackTrace });
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)code;
        return context.Response.WriteAsync(result);
    }
}

Документация с Microsoft

Answer 2

Из стандартных: Microsoft.Extensions.Logging.

В Startup.Configure:

loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddFile("C:\\log\\Лог.log");
            loggerFactory.AddDebug();

Далее через DI их получаем, включая в конструктор ILogger.

Далее в нужных местах пишем Log, обработку. В некоторых местах (где не обработали) может выдать сам ошибку в файл loggerFactory.AddDebug();

Возможно если покапаться, то можно писать в поток, а поток отправлять на сервер, который бы вам отправлял нужные вам сообщения.

P.S. Вопрос выше даже без отдельного сервера работает и кажется предоставляет больше данных. Объедините наши ответы и (думаю) получите то, что хотите. Ну и стоит немного скурить мануалов по Microsoft.Extensions.Logging

READ ALSO
Контекстное меню на элементе списка

Контекстное меню на элементе списка

Есть форма поискаХочу добавить контекстное меню на элементе, который является результатом поиска(например на фамилии работника при нажатии...

220
Получить имена доступных сетевых папок

Получить имена доступных сетевых папок

Есть сервер с несколькими расшаренными папками, например

178
Отправка и чтение данных по COM-порту

Отправка и чтение данных по COM-порту

Здравствуйте, уважаемые программисты!

224
Проверка IAP подписки в Юнити

Проверка IAP подписки в Юнити

Как проверить если юзер купил подписку и дать доступ к игре, игра на iOS, как получить информацию о статусе юзера (подписан или нет) или срок...

238