从托管为 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 App Service

Azure ARM 模板“找不到带有名称的托管环境

Azure 中托管的 ASP.Net Web API 高响应时间

将 Azure App Service 应用程序设置传递给 SPA JS 应用程序

如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?

在 Chrome 中托管在 Azure 中的 ASP.NET Core Web 应用程序上的异常 HTTP 响应