我的函数有很多步骤。我做的第一件事就是创建一个数据库记录,在其中存储该特定运行的 context.InstanceId。使用应用程序洞察,我弄清楚了如何进入 TransactionSearch 并使用该实例 id 来查询该运行的具体信息,但我看到的只是各种任务的基本信息,如计划、开始、完成等。如何访问打开 LogStream 并切换到 FileSystemLogs 时看到的日志?在那里我可以看到我的函数正在记录的所有内容,例如调试和信息语句。
我希望能够以某种方式准确提取我打开 LogStream 窗口时会看到的内容。
我创建了一个示例 Azure Durable 函数,并且能够将跟踪记录到 Application Insights。
安装以下 NuGet 包
Microsoft.ApplicationInsights
Microsoft.ApplicationInsights.WorkerService
我的
.csproj
文件中的包:
<PackageReference Include="Microsoft.ApplicationInsights" Version="2.21.0" />
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.15.0" />
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.18.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.0.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.13" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.13.0" />
在
AddApplicationInsightsTelemetryWorkerService
中配置ConfigureServices
,在AddApplicationInsights
中配置ConfigureLogging
。
我的program.cs文件:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("local.settings.json", optional: false, reloadOnChange: true)
.Build();
var Conn = configuration["ApplicationInsights:ConnectionString"];
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddApplicationInsightsTelemetryWorkerService(
options => options.ConnectionString = Conn);
services.AddLogging();
})
.ConfigureLogging(logging =>
{
logging.AddApplicationInsights();
})
.ConfigureFunctionsWorkerDefaults()
.Build();
host.Run();
您可以使用
local.settings.json
或 host.json
文件来配置 Application Insights。
我的
local.settings.json
文件:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"APPINSIGHTS_INSTRUMENTATIONKEY": "**********
},
//configure local.settings.json for app insights
"ApplicationInsights": {
"ConnectionString": "InstrumentationKey=**********;IngestionEndpoint=https://****-2.in.applicationinsights.azure.com/;LiveEndpoint=https://****.livediagnostics.monitor.azure.com/"
}
}
我的样品
Function1.cs
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.DurableTask;
using Microsoft.DurableTask.Client;
using Microsoft.Extensions.Logging;
namespace FunctionApp2
{
public static class Function1
{
[Function(nameof(Function1))]
public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
ILogger logger = context.CreateReplaySafeLogger(nameof(Function1));
logger.LogInformation("Saying hello.");
var outputs = new List<string>();
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "Tokyo"));
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "Seattle"));
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "London"));
return outputs;
}
[Function(nameof(SayHello))]
public static string SayHello([ActivityTrigger] string name, FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger("SayHello");
logger.LogInformation("Saying hello to {name}.", name);
return $"Hello {name}!";
}
[Function("Function1_HttpStart")]
public static async Task<HttpResponseData> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
[DurableClient] DurableTaskClient client,
FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger("Function1_HttpStart");
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
nameof(Function1));
logger.LogInformation("Started orchestration with ID = '{instanceId}'.", instanceId);
return client.CreateCheckStatusResponse(req, instanceId);
}
}
}
日志流:
Application Insights 交易搜索中的痕迹: