Замените TraceWriter на ILogger в лазурной функции V2

Мы пытаемся перенести функцию 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

person mslugx    schedule 21.09.2018    source источник
comment
Похоже, run.csx не может найти код в вашем файле Code.cs? Этот код находится в одном из файлов .dll, которые вы импортируете в верхней части ваших файлов run.csx? Кроме того, ваши сообщения об ошибках устарели с вашим кодом, так как нет ссылки на log.Error() в строке 12, а ex.Rethrow() находится в строке 12, а не в строке 13.   -  person Connor McMahon    schedule 25.09.2018
comment
@ConnorMcMahon дело в том, что если я не использую Ilogger, то он будет работать, но если я заменю traceWriter на Ilogger, произойдет эта ошибка. :(   -  person mslugx    schedule 27.09.2018
comment
Без подписи вашего метода Run в файле Code.cs очень сложно это диагностировать.   -  person Connor McMahon    schedule 27.09.2018
comment
также, с какой версии вы обновляетесь? Было ли это раньше приложением функции v1?   -  person Connor McMahon    schedule 27.09.2018
comment
Я обновляюсь с V2 до V2. Но для другой версии nuget, чтобы соответствовать новым стандартам V2. Я также обновил метод запуска. пожалуйста, взгляните.   -  person mslugx    schedule 28.09.2018


Ответы (1)


Вам нужно сделать две вещи:

  1. Сначала добавьте ссылку на файл Ilogger.

    В верхней части функции добавьте оператор using Microsoft.Extensions.Logging;.

  2. Во-вторых, вам нужно будет использовать имена методов Ilogger. Измените log.Error(errorMessage) на log.LogError(errorMessage). Вам нужно будет сделать это везде, где вы были при вызове методов TraceWriter.

Вот полный список новых Методы ILogger.

В качестве примера ниже приведена полностью реализованная функция Azure v2 .NET Standard с использованием Ilogger вместо Tracewriter:

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");
        }
    }
}
person Troy Witthoeft    schedule 24.10.2018
comment
Только что проделав это, следует обратить внимание на изменение параметров, поскольку TraceWriter.Error(message,exp) становится ILogger.LogError(exp,message). Если вы не сделаете обратное, как я, вы в конечном итоге вызовете ILogger.LogError(message,args) и получите Invalid Format String. - person Iain; 23.01.2019