使用Microsoft.Extensions.Logging时LogError未记录异常的问题
解决ILogger.LogError只打印消息不输出异常的问题
我来帮你搞定这个日志只显示消息、不输出异常详情的问题!你调用_logger.LogError(ex,"Failed to do stuff")的写法是完全正确的,问题出在日志输出模板的配置上——默认的控制台和文件日志模板并没有包含异常信息的占位符,所以即使你传入了Exception对象,日志提供者也不会输出它的堆栈和详情。
核心原因
不管是AddConsoleLogger还是你用的文件日志提供者,它们的默认输出模板通常只包含时间戳、日志级别和消息内容,缺少{Exception}这个关键占位符,而这个占位符正是用来渲染异常信息(包括堆栈追踪)的。
解决步骤
1. 修改appsettings.json配置(推荐方式)
直接在配置文件里给控制台和文件日志添加包含{Exception}的模板:
{ "Logging": { "LogLevel": { "Default": "Information", "System": "Information", "Microsoft": "Information" }, "Console": { "FormatterOptions": { "TimestampFormat": "yyyy-MM-dd HH:mm:ss ", "Template": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}" } }, "File": { "FormatterOptions": { "Template": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}" } } }, "FileLoggingOptions": { "FileName": "app-", "LogDirectory": "logs", "FileSizeLimit": 10485760, "Extension": "log" } }
模板里的{Exception}占位符会自动处理:如果有异常传入,就输出完整的异常信息(包括堆栈);如果没有异常,就不会显示这部分内容。
2. 或者通过代码配置日志模板
如果你更倾向于用代码而非配置文件来设置,也可以在ConfigureLogging方法里直接指定模板:
控制台日志配置
configLogging.AddConsole(options => { options.FormatterOptions = new SimpleConsoleFormatterOptions { TimestampFormat = "yyyy-MM-dd HH:mm:ss ", Template = "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}" }; });
文件日志配置(以常见的Microsoft.Extensions.Logging.File包为例)
configLogging.AddFile(options => { hostContext.Configuration.GetSection("FileLoggingOptions").Bind(options); // 自定义日志格式,包含异常信息 options.FormatLogEntry = entry => $"{entry.Timestamp:yyyy-MM-dd HH:mm:ss} [{entry.Level:u3}] {entry.Message}{Environment.NewLine}{entry.Exception}"; });
验证修改
配置完成后,重新运行程序,当DoStuff方法抛出异常时,日志就会同时显示你设置的消息Failed to do stuff,以及完整的异常堆栈追踪信息了。
内容的提问来源于stack exchange,提问作者Mugen
相关产品推荐
相关产品推荐

