【问题标题】:How can I view console or trace output in an azure app service? Console.WriteLine or Trace.TraceError如何在 Azure 应用服务中查看控制台或跟踪输出? Console.WriteLine 或 Trace.TraceError
【发布时间】:2020-06-27 00:25:27
【问题描述】:

我认为这很简单,但几个小时后我意识到事实并非如此。我在 Azure 上部署了一个“应用服务”,它是一个 C# .Net Core。

我正在尝试通过使用 Console.WriteLine("my message") 或 Trace.TraceError("my message") 添加一些粗略的应用程序监控,但我在 Azure 的任何地方都找不到该输出。

我尝试启用 Application Insights,但也没有找到输出。

我只想用最简单的方法来了解我的应用程序中的某行代码是否受到攻击。最简单的方法是什么?

我尝试过的事情: 1) 我进入 Azure 的控制台并浏览到每个可能有这种输出但没有找到的文件。当然,在 LogFiles 下的任何文件和文件夹中都没有。 2)我确实转到“应用程序服务日志”并启用了“应用程序日志记录(文件系统)”。 3)我还在“应用服务日志”中启用了“详细错误消息”。 4)我尝试了“诊断设置(预览)”,但在那里找不到输出。 5) 我观看了应用程序日志的“日志流”,但那里没有任何显示 6)在“日志”下我只有这条消息:“我们没有找到任何日志” 7)“metrics”和“Alerts”都没有这个日志输出

我开始怀疑 Azure 不支持此功能。我是否需要添加一个像 serilog 这样的日志框架,只是一次向可能的应用程序添加一个语句,比如“你打了第 20 行”?我真的只是想要一些快速而肮脏的东西,但是在花了几个小时之后,它的“快速”部分并没有发生。

【问题讨论】:

    标签: azure logging console trace


    【解决方案1】:

    您可以打开 Kudu 并查看Console.WritLine 的输出。从门户打开它或:

    https://your_app_name_on_azure.scm.azurewebsites.net/api/logstream

    别忘了在 azure 中启用日志:

    【讨论】:

      【解决方案2】:

      我所做的只是在 Azure 门户中启用应用服务日志。

      为此,我专门在“详细”级别打开了“应用程序日志记录(文件系统)”,然后在“Web 服务器日志记录”选项中选择了“文件系统”

      然后您可以使用左侧栏中的“日志流”来显示应用程序日志。

      在您的代码中,您只需调用

      System.Diagnostics.Trace.TraceInformation("My message!")
      

      或者

      System.Diagnostics.Trace.WriteLine("My message!")
      

      就是这样!

      这里我附上一些截图:

      【讨论】:

      • 我遵循了完全相同的设置,但没有任何运气!
      • 尝试使用“详细”级别而不是“信息”...
      • 谢谢,这个答案很有帮助。此外,值得一提的是,您可以使用 Kudo 控制台在 Azure 门户中下载应用服务日志文件。要打开 Kudo 控制台,请导航到 Azure 中的应用服务,单击开发工具 |高级工具。打开 Kudo 后,单击“调试控制台”菜单并选择“CMD”。此时,您应该会在页面顶部看到一个文件夹视图,允许您访问/下载文件和文件夹(即 LogFiles 或 LogFiles/http)。
      【解决方案3】:

      我终于自己弄明白了。我需要添加配置 AzureFileLoggerOptions。如果没有这些选项,Azure 输出中不会显示任何内容。

      .ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
      .ConfigureServices(serviceCollection => serviceCollection
          .Configure<AzureFileLoggerOptions>(options =>
          {
              options.FileName = "azure-diagnostics-";
              options.FileSizeLimit = 50 * 1024;
              options.RetainedFileCountLimit = 5;
          }).Configure<AzureBlobLoggerOptions>(options =>
          {
              options.BlobName = "log.txt";
          })
      )
      

      总而言之,对于 .Net Core 3.1,要让您的消息显示在“日志流”中,您需要在 Azure 的“应用服务日志”部分启用“应用程序日志记录”。在您的代码中,您需要参考:

      使用 Microsoft.Extensions.DependencyInjection;

      使用 Microsoft.Extensions.Logging.AzureAppServices;

      另外,就我而言,我正在使用 Blazor/SignalR 并且没有 MVC 控制器,因此我无法弄清楚如何在我的班级中访问 Logging 框架。我确信有更好的方法,但是通过在下面的代码中公开 ILogger,我可以从代码库中的任何位置引用它。

      我调用了一个静态方法来写入日志(当我在我的电脑上主动调试时是控制台,或者在 Azure 中运行时是 Azure“日志流”:

      public static void WriteToLog(string message)
      {
          Program.Logger.LogError(message);
      }
      

      我的 Program.cs 中的代码如下所示:

      public class Program
          {
              public static ILogger Logger;
              public static void Main(string[] args)
              {
                  //CreateHostBuilder(args).Build().Run();
      
                  var host = CreateHostBuilder(args).Build();
      
                  var LoggerF = LoggerFactory.Create(builder =>
                  {
                      builder.AddFilter("BlazorDiceRoller", LogLevel.Warning)
                      .AddConsole().AddAzureWebAppDiagnostics()
                      .AddFilter("Microsoft", LogLevel.Warning)
                      .AddFilter("System", LogLevel.Warning);
                  });
                  Logger = LoggerF.CreateLogger<Program>();
                  host.Run();
              }
      
              public static IHostBuilder CreateHostBuilder(string[] args) =>
                  Host.CreateDefaultBuilder(args)
                  .ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
                  .ConfigureServices(serviceCollection => serviceCollection
                      .Configure<AzureFileLoggerOptions>(options =>
                      {
                          options.FileName = "azure-diagnostics-";
                          options.FileSizeLimit = 50 * 1024;
                          options.RetainedFileCountLimit = 5;
                      }).Configure<AzureBlobLoggerOptions>(options =>
                      {
                          options.BlobName = "log.txt";
                      })
                  )
                  .ConfigureWebHostDefaults(webBuilder =>
                  {
                      webBuilder.UseStartup<Startup>();
                  });
          }
      

      【讨论】:

        【解决方案4】:

        是的,仅 .NET 核心不支持此(控制台或跟踪输出)。您应该按照以下步骤使用ILogger

        Startup.cs -> Configure 方法中,重写配置方法如下:

            public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
               //your other code
        
                //add the following 2 lines of code.
                loggerFactory.AddConsole();
                loggerFactory.AddDebug();
        
        
                app.UseStaticFiles();
        
                //your other code
            }
        

        然后在HomeController.cs(例如)中,添加如下代码:

         public class HomeController : Controller
         {
            private readonly ILogger _logger; 
        
            public HomeController(ILoggerFactory loggerFactory)
            {
                _logger = loggerFactory.CreateLogger<HomeController>();
            }
        
            public IActionResult Index()
            {
                _logger.LogInformation("this is a information from ILogger...");
        
                return View();
            }
        
            //other code
        
          }
        

        如果您还有其他问题,请告诉我。

        【讨论】:

        • 感谢伊万的回复。我正在使用带有 SignalR 的 Blazor 并且没有控制器,所以我不知道获取记录器的最佳方法。我弄清楚了为什么它对我不起作用,您可以在我发布给我自己的问题的答案中看到我的解决方案。
        猜你喜欢
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        相关资源
        最近更新 更多