从托管为 Azure Web App 的 ASP.NET 5 应用程序记录日志
Posted
技术标签:
【中文标题】从托管为 Azure Web App 的 ASP.NET 5 应用程序记录日志【英文标题】:Logging from ASP.NET 5 application hosted as Azure Web App 【发布时间】:2016-04-24 07:54:05 【问题描述】:我有一个 ASP.NET 5 Web API 作为 Web 应用程序托管在 Azure 中。我想使用 Azure 诊断从我的代码中记录消息。包括Azure docs 在内的多篇文章表明,一旦启用,它应该像System.Diagnostics.Trace.WriteLine
一样简单。日志应显示在 LogsFiles/Application
下和 Azure 的日志流中。
我为 Web 应用启用了应用程序日志记录:
但以下调用不会产生日志:
System.Diagnostics.Trace.TraceError("TEST");
System.Diagnostics.Trace.TraceInformation("TEST");
System.Diagnostics.Trace.TraceWarning("TEST");
System.Diagnostics.Trace.WriteLine("TEST");
我尝试手动定义TRACE
符号,但没有成功:
我也尝试使用新的Microsoft.Extensions.Logging
框架并使用ILogger.Log
API,但再次没有任何结果:
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
loggerFactory.MinimumLevel = LogLevel.Debug;
var sourceSwitch = new SourceSwitch("Sandbox.AspNet5.ApiApp-Demo");
sourceSwitch.Level = SourceLevels.All;
loggerFactory.AddTraceSource(sourceSwitch,
new ConsoleTraceListener(false));
loggerFactory.AddTraceSource(sourceSwitch,
new EventLogTraceListener("Application"));
关于我做错了什么有什么想法吗?
【问题讨论】:
您好,您检查过您的 web.config 了吗?听众中是否有明确的内容,或者您是否正确注册了 azure ? azure.microsoft.com/en-us/documentation/articles/… 从 Visual Studio 启动日志流,从 Cloud Explorer 窗口(转到网站,右键单击,查看流日志)。这将启用一个小时的日志流。 KUDU 门户上的日志流并不总是启动是我的经验。 @MikeMiller 您所指的说明是否与 asp.net5 相同? @ErikOppedijk 这与问题有什么关系? @MagnusKarlsson 这是关于他问题的最后一部分:“日志应该显示在 LogsFiles/Application 和 Azure 的日志流中。” 【参考方案1】:如果您查看您的web.config
,它可能有stdoutLogEnabled="false"
。如果将其设置为 true,则写入标准输出的任何内容都将写入文件。而stdoutLogFile
决定了它的去向,默认情况下在d:\home\logfiles
之下。
现在您需要确保您的日志记录确实进入标准输出。做Console.WriteLine
肯定会奏效。我认为也可以通过ILoggerFactory
在您的startup.cs
中进行配置,以使日志转到标准输出。
【讨论】:
这会将日志写入 Web 应用程序文件系统,我希望了解如何让它们以与“旧”asp.net 相同的方式进入 azure blob 存储。如果没有人提供有效的解决方案来将日志传输到 Azure blob 存储,那么您将获得赏金。 目前还没有对此的支持,尽管它会出现。可以想象,您可以编写自己的支持(例如基于 github.com/davidebbo-test/ConsoleInterceptor),但这需要一些工作。 好的,你知道它需要一个月还是三个(或六个)才能准备好? 抱歉,没有明确的预计到达时间,但大概需要 2 或 3 个月。 @IanGriffiths 在 IIS 上运行时实际上有一个web.config
。【参考方案2】:
我为 azure app 找到了一个简单的技巧,请参阅 https://github.com/aspnet/Logging/tree/dev/src/Microsoft.Extensions.Logging.AzureAppServices, 请添加包 "Microsoft.Extensions.Logging.AzureAppServices": "1.0.0-preview1-final" 并更新相关依赖项, 像这样在 startup.cs 中添加 azure 诊断:
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
loggerFactory.AddAzureWebAppDiagnostics(); // for default setting.
或自定义设置:
loggerFactory.AddAzureWebAppDiagnostics(new AzureAppServicesDiagnosticsSettings( ...)); // add custom setting.
// see here for detailed member properties: https://github.com/aspnet/Logging/blob/dev/src/Microsoft.Extensions.Logging.AzureAppServices/AzureAppServicesDiagnosticsSettings.cs
并在 azure 上启用诊断日志,登录 blob 和文件都可以正常工作。不需要任何 额外的配置。 :)
【讨论】:
【参考方案3】:通过编写以下类(基于David Ebbo's example),我获得了适用于 ASP.NET 5 Web 应用程序的流式日志输出:
public class AzureApplicationLogTraceListener : TraceListener
private readonly string _logPath;
private readonly object _lock = new object();
public AzureApplicationLogTraceListener()
string instanceId = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID");
if (instanceId != null)
string logFolder = Environment.ExpandEnvironmentVariables(@"%HOME%\LogFiles\application");
Directory.CreateDirectory(logFolder);
instanceId = instanceId.Substring(0, 6);
_logPath = Path.Combine(logFolder, $"logs_instanceId.txt");
public override void Write(string message)
if (_logPath != null)
lock (this)
File.AppendAllText(_logPath, message);
public override void WriteLine(string message)
Write(message + Environment.NewLine);
然后把它放到我的Startup.Configure
:
Trace.Listeners.Add(new AzureApplicationLogTraceListener());
这仅支持基于文件系统的日志记录(这对于实时日志流来说已经足够了)。
【讨论】:
这仅适用于 System.Diagnostics.Trace.*,还是也适用于使用 ILogger? 工作就像一个魅力。谢谢。以上是关于从托管为 Azure Web App 的 ASP.NET 5 应用程序记录日志的主要内容,如果未能解决你的问题,请参考以下文章
Azure 中托管的 ASP.Net Web API 高响应时间
将 Azure App Service 应用程序设置传递给 SPA JS 应用程序