我有一个使用 v4 的 .NET 8 隔离函数。 我在这里遵循本指南来让 AppInsights 正常工作并使用 Nuget 的最新 AppInsights。 我的 Program.cs 看起来几乎与他们在这里给出的示例相同:https://github.com/devops-circle/Azure-Functions-Logging-Tests/blob/master/Func.Isolated.Net7.With.AI/Program。 CS
在我的函数中,我做了一些简单的事情来测试日志记录:
_logger.LogTrace("TestLog Trace");
_logger.LogInformation("TestLog Information");
_logger.LogError( "TestLog Error");
_logger.LogError(new Exception("something wrong"),"TestLog ErrorWithException");
日志显示在应用程序洞察中的事务搜索中,但它们都显示为跟踪条目,并且严重性级别始终为“信息”
这是我的 apsettings.json:
{
"IsEncrypted": false,
"Values": {
SNIPPED
},
"logging": {
"fileLoggingMode": "always",
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
},
"logLevel": {
"default": "Trace",
"xxFunction.DoSomeAction": "Debug",
"xxFunction.Login": "Debug",
"xxFunction.WelcomeGiftQueue": "Debug"
},
"extensions": {
"queues": {
"maxPollingInterval": "00:00:10",
"visibilityTimeout": "00:00:30",
"batchSize": 16,
"maxDequeueCount": 5,
"newBatchThreshold": 8,
"messageEncoding": "base64"
}
}
},
"ApplicationInsights": {
"LogLevel": {
"Default": "Trace"
}
}
}
这是我的 Program.cs:
using Application.Interfaces;
using AzureFunctionApp.Functions.Middleware;
using Infrastructure;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Azure.Core.Serialization;
using Newtonsoft.Json.Converters;
public class Program
{
static ILogger _logger;
public Program(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<Program>();
}
public static void Main()
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults(builder =>
{
builder.UseMiddleware<ExceptionLoggingMiddleware>();
builder.UseWhen<AuthenticationMiddleware>(ctx =>
{
return ctx.FunctionDefinition.InputBindings.Values
.First(a => a.Type.EndsWith("Trigger")).Type == "httpTrigger";
});
})
.ConfigureServices((ctx, serviceProvider) =>
{
serviceProvider.AddApplicationInsightsTelemetryWorkerService();
serviceProvider.ConfigureFunctionsApplicationInsights();
serviceProvider.Configure<WorkerOptions>(workerOptions =>
{
JsonSerializerSettings settings = NewtonsoftJsonObjectSerializer.CreateJsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.NullValueHandling = NullValueHandling.Ignore;
workerOptions.Serializer = new NewtonsoftJsonObjectSerializer(settings);
});
serviceProvider.AddInfrastructureServices(ctx.Configuration);
})
.ConfigureAppConfiguration((hostContext, config) =>
{
config.AddJsonFile("appsettings.json", optional: true);
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.AddSimpleConsole(console =>
{
console.IncludeScopes = true;
});
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
})
.Build();
host.Run();
}
}
您所遵循的指南适用于
.NET 7 isolated
。
我创建了一个示例
.NET 8 isolated
Http 触发函数
并添加了您的日志记录示例。
我在我的
loglevel
中添加了host.json
:
"logging": {
"logLevel": {
"default": "Trace"
},
并且显示正确的
logs
和 severity Level
正确。
host.json
:
{
"version": "2.0",
"logging": {
"logLevel": {
"default": "Trace"
},
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
},
"enableLiveMetricsFilters": true
}
}
}
program.cs
:
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services => {
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.Build();
host.Run();
HttpTrigger.cs
:
using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
namespace Company.Function
{
public class HttpTrigger1
{
private readonly ILogger _logger;
public HttpTrigger1(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<HttpTrigger1>();
}
[Function("HttpTrigger1")]
public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
_logger.LogWarning("Tracelog warning");
_logger.LogError( "Tracelog Error");
var response = req.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
response.WriteString("Welcome to Azure Functions!");
return response;
}
}
}
*.cproj
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.2" />
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.0.0" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
</ItemGroup>
</Project>
OUTPUT
: