【问题标题】:Logging from ASP.NET 5 application hosted as Azure Web App从托管为 Azure Web App 的 ASP.NET 5 应用程序记录日志
【发布时间】:2023-04-02 07:24:02
【问题描述】:

我有一个 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 的日志流中。”

标签: c# azure logging asp.net-core azure-diagnostics


【解决方案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?
    • 工作就像一个魅力。谢谢。
    猜你喜欢
    • 2023-04-08
    • 2015-12-24
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2016-03-24
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多