ASP.NET Core中System.Diagnostics.Trace无法输出至Azure Log Stream问题
你遇到的情况确实是ASP.NET Core和.NET Framework在日志系统集成上的差异导致的——ASP.NET Core默认不会将System.Diagnostics.Trace的输出转发到内置日志管道,而Azure App Service的Log Stream是监听ASP.NET Core内置日志系统的输出,所以直接用Trace.WriteLine这类方法写的日志不会出现在Log Stream里;而.NET Framework中Trace和IIS/Azure的日志体系是默认打通的,所以能正常显示。
下面给你几个可行的解决办法:
方法一:改用ASP.NET Core内置的ILogger接口(推荐)
这是ASP.NET Core的标准日志方式,天然支持Azure Log Stream,用法也很简单:
- 在控制器中注入
ILogger:
private readonly ILogger<YourController> _logger; public YourController(ILogger<YourController> logger) { _logger = logger; }
- 用
ILogger输出日志:
_logger.LogInformation("Wrote info log at {Time}", DateTime.Now.ToLongTimeString()); _logger.LogError("Wrote error log at {Time}", DateTime.Now.ToLongTimeString());
这种方式不需要额外配置,只要你已经在Azure启用了Application Logging,日志就会自动出现在Log Stream中。
方法二:桥接System.Diagnostics.Trace到ASP.NET Core日志系统
如果你不想修改现有代码,想继续用System.Diagnostics.Trace,可以通过配置让Trace的输出进入Core的日志管道:
安装NuGet包:
Microsoft.Extensions.Logging.TraceSource在
Program.cs中配置日志服务,添加TraceSource的桥接:
var builder = WebApplication.CreateBuilder(args); // 添加TraceSource日志桥接,将Trace输出转发到Core日志系统 builder.Logging.AddTraceSource( new SourceSwitch("TraceSwitch", "Information"), // 设置日志级别,可根据需求调整 new Microsoft.Extensions.Logging.TraceSource.TraceListenerAdapter() ); // 其他应用配置... var app = builder.Build();
这样System.Diagnostics.Trace的输出就会被转发到ASP.NET Core的日志系统,进而在Azure Log Stream中显示。
方法三:检查Azure App Service的日志级别配置
确保你在Azure Portal的Diagnostic Logs中,不仅启用了Application Logging (Filesystem),还设置了合适的日志级别(比如“Information”或更低)。如果级别设得太高(比如只选“Error”),那Info级别的Trace消息也不会被Log Stream捕获。
配置完成后,记得重启你的Azure App Service应用,让配置生效,再测试Log Stream就能看到日志了。
内容的提问来源于stack exchange,提问作者sakura-bloom

