首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft.Extensions.Logging - LogError不是记录异常。

Microsoft.Extensions.Logging - LogError不是记录异常。
EN

Stack Overflow用户
提问于 2019-09-19 12:21:38
回答 2查看 15.4K关注 0票数 17

我使用的是通过依赖注入获得的简单ASP.NET提供的记录器:Microsoft.Extensions.Logging.ILogger<T>。在实践中,动态类型是Microsoft.Extensions.Logging.Logger<T>

当捕获异常时,我试图使用:_logger.LogError(exception, "message")记录它们,但是只打印消息。

代码语言:javascript
复制
namespace App
{
    public class App : IApp
    {
        private readonly ILogger<App> _logger;

        public PomParser(ILogger<App> logger)
            => _logger = logger;

        public void DoStuff()
        {
            try
            {
                DoStuffUnsafe();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex,"Failed to do stuff");
            }
        }
    }
}

如何配置日志记录:

代码语言:javascript
复制
var host = new HostBuilder().ConfigureLogging(ConfigureLogging)...
...
await host.RunAsync();
代码语言:javascript
复制
        private static void ConfigureLogging(HostBuilderContext hostContext, ILoggingBuilder configLogging)
        {
            configLogging.ClearProviders();
            configLogging.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
            configLogging.AddFile(
                options =>
                {
                    hostContext.Configuration.GetSection("FileLoggingOptions")
                        .Bind(options);
                }
            );
            configLogging.AddConsoleLogger();
        }

应用程序:

代码语言:javascript
复制
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "FileLoggingOptions": {
    "FileName": "app-",
    "LogDirectory": "logs",
    "FileSizeLimit": 10485760,
    "Extension": "log"
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-19 16:51:08

请参见默认的MessageFormatterhttps://github.com/aspnet/Logging/blob/master/src/Microsoft.Extensions.Logging.Abstractions/LoggerExtensions.cs

代码语言:javascript
复制
        private static string MessageFormatter(FormattedLogValues state, Exception error)
        {
            return state.ToString();
        }

它只是忽略了例外..。我实现了一个自定义控制台记录器:

代码语言:javascript
复制
public class ConsoleLoggerProvider : ILoggerProvider
{
    public void Dispose()
    {
    }

    public ILogger CreateLogger(string categoryName)
        => new ConsoleLogger(categoryName);

    private class ConsoleLogger : ILogger
    {
        private readonly string _categoryName;

        public ConsoleLogger(string categoryName)
            => _categoryName = categoryName;

        public void Log<TState>(
            LogLevel logLevel, EventId eventId, TState state, Exception exception,
            Func<TState, Exception, string> formatter
        )
        {
            if (!IsEnabled(logLevel))
            {
                return;
            }

            Console.WriteLine(
                $"{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} [{logLevel}] {_categoryName}: {state}{(exception != null ? "\n" : string.Empty)}{exception}"
            );
        }

        public bool IsEnabled(LogLevel logLevel)
            => true;

        public IDisposable BeginScope<TState>(TState state)
            => null;
    }
}

并利用它:

代码语言:javascript
复制
public static Task Main(string[] args)
    => WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(...)
        .ConfigureServices(...)
        .ConfigureLogging((hostContext, loggingBuilder) => loggingBuilder.AddProvider(new ConsoleLoggerProvider()))
        .UseStartup<Startup>()
        .Build()
        .RunAsyncSafe();
票数 5
EN

Stack Overflow用户

发布于 2021-07-12 18:09:02

如果您的记录器没有记录异常,也可能是因为您意外地把传递参数的顺序弄错了:

代码语言:javascript
复制
_logger.LogError("An error occurred", e)     // WRONG: Exception will not be logged

正确的顺序是始终以第一个参数的形式提供异常对象:

代码语言:javascript
复制
_logger.LogError(e, "An error occurred")     // OK: Will log the exception

参考资料:

https://blog.rsuter.com/logging-with-ilogger-recommendations-and-best-practices/#always-pass-exception-as-first-parameter

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58010923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档