簡體   English   中英

在 Azure 日志流中看不到日志

[英]Can't see logs in Azure Log Stream

在我的 Web Api 應用程序中,我有控制器:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        System.Diagnostics.Trace.TraceInformation("in get...");
        return "value";
    }
}

當我發布它時,我希望能夠在 Azure 上看到“in get...”日志。 在 Azure 上,在App Service Logs我打開Application Logging (Filesystem)並將級別設置為Information Log Stream ,當我轉到該方法的 url 時,我在日志中看到:

正在連接... 2020-02-09T06:07:38 歡迎您,您現在已連接到日志流服務。 默認超時為 2 小時。 使用應用程序設置 SCM_LOGSTREAM_TIMEOUT(以秒為單位)更改超時。 2020-02-09 06:08:07.158 +00:00 [信息] Microsoft.AspNetCore.Hosting.Internal.WebHost:請求開始 HTTP/1.1 GET http://testapi20200208104448.azurewebsites.net/api/values/5 2020 02-09 06:08:07.159 +00:00 [信息] Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:使用參數執行操作方法 TestApi.Controllers.ValuesController.Get (TestApi) - ModelState is Valid 2020-02 -09 06:08:07.160 +00:00 [信息] Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor:執行 ObjectResult,寫入值 Microsoft.AspNetCore.Mvc.ControllerContext。

但是我沒有看到我的日志“in get ...”

這是 .NET 核心的一個已知問題(但對於 .NET 框架,它可以很好地工作)。

作為 .NET 核心 Web 應用程序的解決方法,我建議您可以使用ILogger ,它可以將消息寫入應用程序日志。 Startup.cs -> Configure方法中,重寫 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
       }

然后在ValuesController

public class ValuesController : Controller
{

    private readonly ILogger _logger; 

   public ValuesController(ILoggerFactory loggerFactory)
   {
    _logger = loggerFactory.CreateLogger<ValuesController>();
   }
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        //System.Diagnostics.Trace.TraceInformation("in get...");

        //use ILogger here.
        _logger.LogInformation("in get...");
        return "value";
    }
}

Ivan 的回答在 aspnetcore 3.1 上並不完全適合我,但它讓我看到了這篇文章,它為我提供了我需要的所有信息:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM