.net - Azure Functions - ILogger 跨类记录

标签 .net azure logging azure-functions

在 Azure 函数中,run 方法创建一个 ILogger,在我的主类中,我可以用它来记录错误和信息,但是,我使用帮助程序类来运行我的 Graph API 和 Cosmos DB 查询。

在单独的类中记录错误和信息的最佳方法是什么,我应该在所有类或方法中传递日志吗?或者是否有更好的方法使 ILogger 在运行时可供所有类使用?

public class AzureFunction
{
    public Task Run([TimerTrigger("0 0 1 * * *")] TimerInfo myTimer, ILogger log)
    {
        log.LogInformation("This message logs correctly");
        GraphHelper graphHelper = new GraphHelper();
        graphHelper.GetGraphData();
    }
}
 
public class GraphHelper
{
    public void GetGraphData()
    {
        try 
        {
            asyncTask() 
        }
        catch (Exception ex) 
        {
            log.LogInformation($"{ex.Message} - How can I log this without passing ILogger to every class or method?");
        }
    }
}
     

最佳答案

正确的方法(恕我直言)是通过依赖注入(inject)。

using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace FunctionApp1
{
   public class HelperClass : IHelperClass
    {
        private static ILogger<IHelperClass> _logger;
        public HelperClass(ILogger<IHelperClass> logger)
        {

            _logger = logger;
        }
        public void Dowork()
        {
            _logger.LogInformation("Dowork: Execution Started");
            /* rest of the functionality below
                .....
                .....
            */
            _logger.LogInformation("Dowork: Execution Completed");
        }
    }
}

主机.json

{
    "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingExcludedTypes": "Request",
      "samplingSettings": {
        "isEnabled": true
      }
    },
    "logLevel": {
      "FunctionApp1.HelperClass": "Information"
    }
  }
}

辅助类

using System;
using System.Collections.Generic;
using System.Text;

namespace FunctionApp1
{
    public interface IHelperClass
    {
        void Dowork();
    }
}

主函数

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace FunctionApp1
{
    public class MainFunction // Ensure class is not static (which comes by default)
    {
        private IHelperClass _helper;
     
        public MainFunction(IHelperClass helper)
        {
            _helper = helper;
        }

        [FunctionName("MainFunction")]
        public void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
            // call helper 
            _helper.Dowork();
        }
    }
}

启动.cs

using Microsoft.Azure.Functions.Extensions.DependencyInjection; // install nuget - "Microsoft.Azure.Functions.Extensions"
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

[assembly: FunctionsStartup(typeof(FunctionApp1.Startup))]

namespace FunctionApp1
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {           
            builder.Services.AddSingleton<IHelperClass,HelperClass>();            

        }
    }
}

完整示例可以在 https://gist.github.com/nareshnagpal06/82c6b4df2a987087425c32adb58312c2 上找到

关于.net - Azure Functions - ILogger 跨类记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68624192/

相关文章:

c# - Xamarin.forms 上的后台获取

c++ - 使用 Boost 同时记录到控制台和文件

node.js - NodeJS 记录器 : winston. transports.DailyRotateFile 不是函数

java - SyslogAppender 不工作

c# - 如何防止点击通过控件传递到其下方的控件

c# - 当基本词以 I 开头时,如何命名接口(interface)?

c# - 如何确定哪些逻辑核心共享同一个物理核心?

c# - 通过 SSL 发送请求时无法发布文件数据

linux - 将域名映射到 Azure Linux VM 应用

azure - 网关在指定时间内没有收到 'Microsoft.DataFactory'的响应