在 Azure 函数 V2 中将 TraceWriter 替换为 ILogger

Posted

技术标签:

【中文标题】在 Azure 函数 V2 中将 TraceWriter 替换为 ILogger【英文标题】:Replace TraceWriter With ILogger in azure function V2 【发布时间】:2019-02-26 04:36:27 【问题描述】:

我们正在尝试将 azure 函数迁移到 sdk.functions 1.0.21 并且我们将所有内容都升级到了 3.0.0-rc1 。控制台提示我们TraceWriter 已过时,请改用ILogger。但是,我们不断遇到问题。

这是我正在使用的代码:

code.cs:

public static async Task Run(Message queueItem, ILogger log, ExecutionContext context)
  using (var scope = Resolver.CreateScope())
  
    var timer = new Stopwatch();

    try
    
      var resolver = scope.ServiceProvider;

      logger = resolver.GetService<IBestLogger>().WithInvocationId(context);
      client = resolver.GetService<IServiceBusFactory>().GetClient(logger, _queue, _failedQueue);
      auditRepository = resolver.GetService<ITplTransactionAuditRepository>();

      asnService = resolver.GetService<IAsnService>();
      var sfWmsService = resolver.GetService<ISnapfulfilWmsService>();

      logger.CreateContext($"_queue process is started for message id.").WithServiceBusMessage(queueItem).LogInformation();
    
  

  catch (Exception ex2)
  
    errorMessage = $"Unable to set record to Error status for message id queueItem.MessageId in _queue.";
    if (logger == null)
      log.Error(errorMessage);
    else
      logger.CreateContext(errorMessage, ex2).LogError();
  

function.json:


  "bindings": [
    
      "queueName": "%InvoiceDetailCalculate_Queue%",
      "connection": "ServiceBus_Connection",
      "name": "queueItem",
      "type": "serviceBusTrigger",
      "direction": "in",
      "accessRights": "manage"
    
  ],
  "disabled": false

Run.csx:

#r "../bin/Best.Billing.Functions.dll"
#r "../bin/Best.Libraries.Utility.dll"

public static async void Run(Message queueItem, ILogger log, ExecutionContext context)

    try
    
        Code.Run(queueItem, log, context).Wait();
    
    catch (Exception ex)
            
        ex.Rethrow();
    

错误信息是:

Run.csx(4,26): warning AF008: This method has the async keyword but it returns void
Run.csx(4,30): error CS0246: The type or namespace name 'Message' could not be found (are you missing a using directive or an assembly reference?)
Run.csx(8,9): error CS0103: The name 'Code' does not exist in the current context
Run.csx(12,13): error CS1061: 'ILogger' does not contain a definition for 'Error' and no extension method 'Error' accepting a first argument of type 'ILogger' could be found (are you missing a using directive or an assembly reference?)
Run.csx(13,12): error CS1061: 'Exception' does not contain a definition for 'Rethrow' and no extension method 'Rethrow' accepting a first argument of type 'Exception' could be found (are you missing a using directive or an assembly reference?)
Run.csx(4,26): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
Function compilation error

【问题讨论】:

run.csx 好像在您的 Code.cs 文件中找不到代码?该代码是否在您在 run.csx 文件顶部导入的 .dll 文件之一中?此外,您的错误消息与您的代码已过时,因为第 12 行没有对 log.Error() 的引用,而 ex.Rethrow() 在第 12 行,而不是第 13 行。 @ConnorMcMahon 问题是如果我不使用 Ilogger,那么它会起作用,但是如果我用 Ilogger 替换 traceWriter,则会发生此错误。 :( 如果没有您在 Code.cs 文件中的 Run 方法的签名,则很难诊断。 另外,你是从哪个版本升级的?这是以前的 v1 函数应用吗? 我正在从 V2 升级到 V2。但是对于不同的 nuget 版本以适应新的 V2 标准。我也更新了运行方法。请看一下。 【参考方案1】:

你需要做两件事:

    首先,添加对Ilogger 的引用。

    在函数顶部,添加using Microsoft.Extensions.Logging; 语句。

    其次,您需要使用Ilogger 方法名称。将log.Error(errorMessage) 更改为log.LogError(errorMessage)。您需要在正在调用 TraceWriter 方法的任何地方执行此操作。

这里是a full list of the newer ILogger methods。

例如,下面是使用 Ilogger 而不是 Tracewriter 的完全实现的 Azure Function v2 .NET Standard:

using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using Microsoft.Extensions.Logging;

namespace FunctionApp1

    public static class Function1
    
        [FunctionName("Function1")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req,
            ILogger log)
        
            log.LogInformation("C# HTTP trigger function processed a request.");


            string name = req.Query["name"];

            string requestBody = new StreamReader(req.Body).ReadToEnd();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, name")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        
    

【讨论】:

刚刚做了这个,需要注意的是把参数反转为 TraceWriter.Error(message,exp) 变成 ILogger.LogError(exp,message)。如果你不像我那样反转,你最终会调用 ILogger.LogError(message,args) 你会得到 Invalid Format String。

以上是关于在 Azure 函数 V2 中将 TraceWriter 替换为 ILogger的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure Function v2(核心)中静态使用 ConfigurationBuilder?

使用 Azure Function V2 Durable 函数时,ILogger 不记录到 Application Insights

如何在数据工厂管道中将路由传递给 Azure 函数(C#)http 触发器?

Azure Function v2 引用了 Newtonsoft.Json 版本高于 Microsoft.NET.Sdk.Functions 的项目

Visual Studio 2019 不会调试 Azure Function V2

为啥 Azure Function V2 中很少有 Python 包不支持?