Azure 函数应用程序日志在转换为使用新线程后停止输出到日志分析

问题描述 投票:0回答:1

我有一个运行很长操作的 C# 函数应用程序,以及一个使用 AzureFunction@1 任务调用它的管道。使用此任务的方法是在新线程中启动函数实际工作,立即向管道返回函数已开始工作的响应,然后启动管道倒计时。

该函数的第一个实现使用了单个线程,然后一切都按预期工作,至少在日志方面是这样。将函数转换为在新线程中完成其工作后(使用

Task.Run(()=> ... )
),首先我会在应用程序洞察中看到来自新线程的一些日志(使用
ILogger
记录),但在 3 或 4 个条目之后,它就停止了,我不知道该函数是否正在运行(管道本身继续运行,等待响应)。

在新线程中写入时是否需要更改日志记录?您认为还有其他因素会影响它吗?

编辑:似乎使用 Console.Writeline 确实有效。不知道是否有助于识别问题

我的代码的伪代码来演示我在做什么:

public MyWorkingClass(ILogger日志) { _logger=日志; }

public string Run()
{
  //this is not blocking so the return would be called immediately 
  Task.Run(() =>
  {
    _logger.LogInformation("starting");
    ... do more stuff ..
  }
  return "Starting task";
}
azure multithreading azure-functions appinsights
1个回答
0
投票

我最终所做的是在新线程中创建自己的

ILogger
,使用与我的
host.json
文件中相同的配置,使用此方法:

internal static ILogger GetILogger(string loggerName)
{
 var configuration = new ConfigurationBuilder()
                        .AddJsonFile("host.json", optional: true, reloadOnChange: true)
                        .Build();

  using var loggerFactory = LoggerFactory.Create(builder =>
  {            
      builder.AddConfiguration(configuration.GetSection("logging"));
      builder.AddConsole();
  });

  var logger = loggerFactory.CreateLogger(loggerName);
  return logger;
}

此方法在

Task.Run
范围开始时调用,返回的记录器工作正常,包括记录到应用程序洞察。

© www.soinside.com 2019 - 2024. All rights reserved.