0

我有一个 C# 控制台应用程序,它从数据库中获取数据并查询它,然后等待 1 小时来查询新数据。program.cs 被用作启动类来进行依赖注入。运行控制台应用程序时控制台上显示的结果如下:

控制台应用程序结果

我必须将此控制台应用程序转换为一个 azure 计时器触发功能,以便它每 1 小时运行一次,执行与上述相同的工作并记录相同的信息,如图所示。所以我所做的就是从 program.cs 文件中复制代码并将其粘贴到计时器触发器运行方法中。这是代码:

namespace ExportServiceFunctionApp
{
    public class ExportServiceFunctionApp
    {
        [FunctionName("ExportServiceFunctionApp")]
        public static void Run([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)
        {
            log?.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            try
            {
                IServiceCollection services = new ServiceCollection();


                services.AddSingleton<IDataReceiver, DataReceiver.DataReceiver>()
                        .AddSingleton<IDataProcessor, DataProcessor.DataProcessor>()
                        .AddSingleton<IDataClient, KustoDataClient>()
                        .AddSingleton<IAzureBlobClient, AzureBlobClient>()
                        .AddSingleton<IAzureKustoClient, AzureKustoClient>()
                        .AddSingleton<IQueriesSettings, QueriesSettings>()
                        .AddSingleton<IExportServiceSettings, ExportServiceSettings>()
                        .AddTransient<IRawData, RawData>()
                        .AddLogging();

                IServiceProvider serviceProvider = services.BuildServiceProvider();

                log?.LogInformation("Start initialization.");
                var dataProcessor = serviceProvider.GetRequiredService<IDataProcessor>();

                log?.LogInformation("Start data processing.");
                dataProcessor.Start();
            }
            catch (Exception ex)
            {
            }
        }
    }
}

您还可以在此处找到 FunctionApp 的结构:

函数应用结构

ExportServiceFunctionApp.cs执行成功但我在这里缺少的是来自其他类的日志。一个例子是 DataReceiver.cs(注意:还有其他类)。我需要的是在控制台应用程序中获得与上面显示的相同的结果和日志

函数应用的结果如下所示:

FunctionApp 结果

正如您在此处看到的,仅在控制台上显示的日志是在 ExportServiceFunctionApp.cs 的 Run 方法中使用的日志,但在其他类中使用的所有其他日志都不是

举个例子: ILogger 被注入到 DataReceiver 构造函数中,但是当 FunctionApp 在本地运行时,日志没有出现在控制台上。这是 DataReceiver.cs 的代码

public class DataReceiver : IDataReceiver
    {
        private readonly IExportServiceSettings _exportServiceSettings;
        private readonly ILogger _logger;
        private CancellationToken _cancellationToken;
        private TimeSpan _interval;
        private DateTime _lastTo;

        public DataReceiver(IExportServiceSettings exportServiceSettings, ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory?.CreateLogger<DataReceiver>();
            _exportServiceSettings = exportServiceSettings;
        }

host.json 具有以下结构:

{
  "version": "2.0",
  "logging": {
    "fileLoggingMode": "always",
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    },
    "logLevel": {
      "default": "Information"
    }
  }
}

有人可以告诉我如何以与控制台应用程序结果中显示的方式相同的方式记录来自其他类的消息。我仍然不知道为什么只显示RUN 方法中的日志。我之前问过一个类似的问题,但我想它没有得到很好的解释。

4

0 回答 0