我正在尝试控制 C# Azure 函数的日志级别。目标是更改日志级别而无需重新部署该功能。这个想法是改变环境变量来实现这一点。
我添加了一个环境变量来控制日志级别:
它似乎不起作用,因为我仍然看到调试和信息日志记录:
我的 host.json 看起来像这样:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
},
"enableLiveMetricsFilters": true
},
"logLevel": {
"default": "Debug"
}
}
}
Program.cs 像这样:
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Debug))
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.Configure<LoggerFilterOptions>(options => options.Rules.Clear());
})
.Build();
host.Run();
当我在本地运行我的函数应用程序时,当我更改 local.settings.json 时,它会按预期工作:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"AzureFunctionsJobHost__logging__LogLevel__default": "Warning"
}
}
我的功能:
public class Function1
{
private readonly ILogger<Function1> _logger;
public Function1(ILogger<Function1> logger)
{
_logger = logger;
}
[Function("LogDebug")]
public IActionResult RunDebug([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
_logger.LogDebug("***********DEBUG***********");
return new OkObjectResult("Welcome to Azure Functions!");
}
[Function("LogInformation")]
public IActionResult RunInformation([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
_logger.LogInformation("***********INFORMATION***********");
return new OkObjectResult("Welcome to Azure Functions!");
}
[Function("LogWarning")]
public IActionResult RunWarning([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
_logger.LogWarning("***********WARNING***********");
return new OkObjectResult("Welcome to Azure Functions!");
}
}
有人可以阐明我所缺少的内容吗?预先感谢。
.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Debug))
您已将最低级别设置为“调试”。具有最低级别
Debug
的代码对于应用程序洞察力是至关重要的。它在本地工作正常,但对于门户来说它是压倒一切的。
host.json
:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
},
"enableLiveMetricsFilters": true
},
"logLevel": {
"default": "Debug"
}
}
}
Function.cs
:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
using System.ComponentModel;
namespace FunctionApp5
{
public class Function
{
private readonly ILogger<Function> _logger;
public Function(ILogger<Function> logger)
{
_logger = logger;
}
[Function("Function")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
{
_logger.LogDebug("************DEBUG***********");
_logger.LogInformation("*************INFORMATION*************");
_logger.LogWarning("******************WARNING**************");
_logger.LogError("************ERROR***********");
_logger.LogCritical("************CRITICAL***********");
_logger.LogInformation("C# HTTP trigger function processed a request.");
return new OkObjectResult("Welcome to Azure Functions!");
}
}
}
我使用相同的代码部署了代码,并且还在应用程序洞察中获取了所有级别的日志。但在
LogStream
我已经超过了Warning
水平。
Program.cs
:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Debug))
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.Configure<LoggerFilterOptions>(options=>options.Rules.Clear());
})
.Build();
host.Run();
您需要将最低级别设置为
Warning
。我可以在应用程序见解和日志流的两个地方看到
Program.cs
:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
var host = new HostBuilder()
.ConfigureFunctionsWebApplication()
.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Warning))
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.Configure<LoggerFilterOptions>(options=>options.Rules.Clear());
})
.Build();
host.Run();
在同事的帮助下,我找到了一种使用环境变量控制日志级别的方法。
我将 Program.cs 更改为以下内容:
var host = new HostBuilder()
.ConfigureAppConfiguration((context, config) =>
{
config.AddJsonFile("host.json", optional: true);
})
.ConfigureFunctionsWebApplication()
.ConfigureServices((_, services) =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.Configure<LoggerFilterOptions>(options => options.Rules.Clear());
})
.ConfigureLogging((context, logging) =>
{
logging.AddConfiguration(context.Configuration.GetSection("AzureFunctionsWorker:Logging"));
})
.Build();
host.Run();
此更改允许通过环境变量配置日志记录。
我的 host.json 看起来像这样:
{
"version": "2.0",
"logging": {
"console": {
"isEnabled": true
},
"applicationInsights": {
"samplingSettings": {
"isEnabled": false,
"excludedTypes": "Request"
},
"enableLiveMetrics": true,
"enableDependencyTracking": true,
"enablePerformanceCountersCollection": true
},
"logLevel": {
"default": "Error"
}
}
}
我可以根据所需的日志级别设置环境变量: 环境变量
结果如下所示: Azure 门户日志