在 Azure Web 应用程序诊断日志中筛选日志

Filtering logs in Azure Web App Diagnostics Logs

是否可以使用 Azure 的 Web 应用诊断日志来过滤日志以捕获应用程序日志?

我想捕获从我们的程序集报告的信息级日志,但仅针对 MS/System 个库的警告。

Startup.cs 看起来如下:

loggerFactory
    .WithFilter(new FilterLoggerSettings
    {
        { "Microsoft", LogLevel.Warning },
        { "System", LogLevel.Warning },
        { "MyAssembly", LogLevel.Information }
    })
    .AddAzureWebAppDiagnostics();

但在 Azure 门户中只有一个选项可以设置级别:

根据您的情况,我已经测试了这个问题,您可以在 Startup.csConfigure 方法中配置您的记录器,如下所示:

loggerFactory
    .WithFilter(new FilterLoggerSettings
    {
        { "Microsoft", LogLevel.Warning },
        { "System", LogLevel.Warning },
        { "{custom-category}", LogLevel.Information}
    })
    .AddAzureWebAppDiagnostics();

注意: 类别将是写入日志的 class 的完全限定名称。如果记录器在 TodoApi.Controllers.TodoController 下,您可以将 {custom-category} 配置为 TodoApi 以将框架日志级别限制为来自程序集的日志信息。

The Azure App Service provider

This provider is available only for apps that target ASP.NET Core 1.1.0 or higher. The provider only works when your project runs in the Azure environment. It has no effect when you run locally -- it does not write to local files or local development storage for blobs.

使用 Azure 应用服务日志记录时,可用的日志级别将是您在过滤规则中设置的级别与您在 Azure 门户上配置的应用程序级别之间较大的级别。为了捕获从程序集报告的信息级别日志,您在 Azure 门户上配置的应用程序级别需要小于或等于信息级别,您可以将其配置为 verboseinformation。更详细的可以参考这个官方tutorial.

更新:

下面是我的测试详情,大家可以参考一下:

日志过滤

loggerFactory
    .WithFilter(new FilterLoggerSettings
    {
        { "Microsoft", LogLevel.Warning },
        { "System", LogLevel.Warning },
        { "WebApplication_FilterLogging", LogLevel.Information }
    })
    .AddConsole()
    .AddDebug()
    .AddAzureWebAppDiagnostics();

HomeController.cs

public class HomeController : Controller
{
    private readonly ILogger _logger;
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        _logger.LogWarning($"Index {DateTime.UtcNow}");
        return View();
    }

    public IActionResult About()
    {
        _logger.LogInformation($"About {DateTime.UtcNow}");
        return View();
    }

    public IActionResult Contact()
    {
        _logger.LogError($"Contact {DateTime.UtcNow}");
        return View();
    }
}

结果

1) 来自我输出的日志 window:

2) 存储在 Blob 存储中的我的应用程序日志中的日志:

当我为 Microsoft/System 库设置信息级日志时,我可以检索以下日志:

您也可以像这样在 appsettings.json 文件中应用过滤器

"Logging": { "IncludeScopes": false, "AzureAppServicesBlob": { "LogLevel": { "Default": "Warning", "Microsoft": "Warning", "System": "Warning", "{custom-category}": "Information" } }, "LogLevel": { "Default": "Warning" } }

还有一个 AzureAppServicesFile 的提供者别名。

我最近在 appsettings.json.

中使用以下日志过滤器时遇到了同样的问题
"Logging": {
    "LogLevel": {
      "Microsoft": "Warning",
      "System": "Warning",
      "Default": "Information"
    }
  }

我必须为每个目标指定日志级别,如下所示。

"Logging": {
    "AzureAppServicesBlob": {
      "IncludeScopes": false,
      "LogLevel": {
        "Microsoft": "Warning",
        "System": "Warning",
        "Default": "Information"
      }
    },
    "AzureAppServicesFile": {
      "IncludeScopes": false,
      "LogLevel": {
        "Microsoft": "Warning",
        "System": "Warning",
        "Default": "Information"
      }
    },
    "LogLevel": {
      "Microsoft": "Warning",
      "System": "Warning",
      "Default": "Information"
    }
  }

Azure 门户中的日志级别设置为信息