2016-11-02 2 views
15

Как я могу повторно использовать объект TraceWriter, доступный в лазурной функции для регистрации информации в библиотеке с внешней ссылкой? Я попытался передать объект с помощью конструктора и ссылаться на класс TraceWriter (web.http.tracing). Мне не повезло, поскольку классы кажутся разными.Запись функции Azure с использованием TraceWriter во внешней библиотеке

ответ

28

короткая версия Используйте Microsoft.Azure.WebJobs.Host.TraceWriter доступны в this nuget package.

В качестве альтернативы, создайте свои функции в виде веб-проекта, и вы сможете отлаживать локально. You can find a sample here.

Long Version

Ваша проблема в том, что вы используете неправильный TraceWriter.

Я использовал регистратор функций Azure в функции Azure для вывода типа регистратора.

log.Info(log.GetType().ToString()); 

Который дал следующее:

Microsoft.Azure.WebJobs.Script.InterceptingTraceWriter

Я тоже ожидал Web/Http TraceWriter и был удивлен, что есть еще одна реализация, чтобы иметь дело с. Microsoft действительно может сделать с созданием стандартного подхода или, по крайней мере, предоставить нам чистый чистый интерфейс для Error, Warning, Info, Verbose и т. Д. Возможно, что-то для .Net Standard ... пожалуйста.

Я создам свой собственный интерфейс и завершу свой регистратор приложений и Azure, чтобы я мог впрыснуть в зависимости от того, что мне нужно, не вызывая головных болей в моем коде. Это также обеспечит некоторую защиту от возможной боли, вызванной будущими нарушениями.

В любом случае, я отвлекаюсь, затем отслеживаю Microsoft.Azure.WebJobs.Script.InterceptingTraceWriter до Azure Functions/Webjobs scripting GitHub repo, а затем на пакет Nuget. Я протестировал это, и он отлично работает, чтобы передать регистратор функций Azure в вашу внешнюю сборку и продолжить доступ к среде Azure Function.

Вот пример:

using Microsoft.Azure.WebJobs.Host; 

public static void TryLog(TraceWriter azureFunctionsLogger) 
{ 
    azureFunctionsLogger.Info("************** IT WORKED **************"); 
} 

Я люблю потенциал Azure функций, но все еще немного незрелыми и слишком сложным.

Надеюсь, это поможет.

Добавлен очень простой регистратор одного класса для иллюстрации.

Он записывается либо в Logger Logger, либо в стандартную систему Diaagnostics.Trace. Вам нужно вставить это содержимое содержимого Program.cs стандартного консольного приложения C#. Вам также потребуется включить пакет Nuget Microsoft.Azure.WebJobs.

namespace LoggingTestConsole 
{ 
    using System; 

    /// <summary> 
    /// Generic logging interface for portability 
    /// </summary> 
    public interface ILogger 
    { 
     void Error(string message); 
     void Information(string message); 
     void Warning(string message); 
    } 


    /// <summary> 
    /// Azure Functions logger 
    /// </summary> 
    public class AzureFunctionLogger : ILogger 
    { 
     private static Microsoft.Azure.WebJobs.Host.TraceWriter _logger; 

     public AzureFunctionLogger(Microsoft.Azure.WebJobs.Host.TraceWriter logger) 
     { 
      _logger = logger; 
     } 

     public void Error(string message) 
     { 
      _logger.Error(message); 
     } 

     public void Information(string message) 
     { 
      _logger.Info(message); 
     } 

     public void Warning(string message) 
     { 
      _logger.Warning(message); 
     } 
    } 


    /// <summary> 
    /// Windows Trace logger 
    /// </summary> 
    public class TraceLogger : ILogger 
    { 
     public TraceLogger() 
     { 
      System.Diagnostics.Trace.Listeners.Add(new System.Diagnostics.TextWriterTraceListener(Console.Out)); 
     } 

     public void Error(string message) 
     { 
      System.Diagnostics.Trace.TraceError(message); 
     } 


     public void Information(string message) 
     { 
      System.Diagnostics.Trace.TraceInformation(message); 
     } 

     public void Warning(string message) 
     { 
      System.Diagnostics.Trace.TraceWarning(message); 
     } 

     public void Warning(string format, params object[] args) 
     { 
      System.Diagnostics.Trace.TraceWarning(format, args); 
     } 
    } 

    /// <summary> 
    /// You would put this in a separate project and just share the ILogger interface. 
    /// Pass the relevant logger in from Azure Functions or a standard windows Trace logger. 
    /// </summary> 
    public class DoStuff 
    { 
     public DoStuff(ILogger logger) 
     { 
      logger.Information("We are logging to logger you passed in!"); 
     } 
    } 

    public class Program 
    { 

     /// <summary> 
     /// Sample usage 
     /// </summary> 
     static void Main(string[] args) 
     { 
      // var loggerEnvironment = "AzureFunctions"; 
      var loggerEnvironment = "ConsoleApp"; 

      ILogger logger = null; 

      if (loggerEnvironment == "AzureFunctions") 
      { 
       Microsoft.Azure.WebJobs.Host.TraceWriter azureFunctionLogger = null; 
       logger = new AzureFunctionLogger(azureFunctionLogger); 
      } 
      else if (loggerEnvironment == "ConsoleApp") 
      { 
       logger = new TraceLogger(); 
      } 

      var doStuff = new DoStuff(logger); 
      Console.ReadKey(); 
     } 
    } 
} 
+4

Спасибо за это, это странно трудно найти это из документов/кода! Каким интерфейсом обладает TraceWriter? – Rory

+1

Начните здесь и проведите свой путь - https://github.com/Azure/azure-webjobs-sdk/blob/663a508e8a851629c26a51e7de3af36629dfd120/src/Microsoft.Azure.WebJobs.Host/TraceWriter.cs прошло некоторое время с тех пор, как я работал с это. В результате я создал собственный интерфейс (добавлен в ответ выше), а затем реализовал его с помощью .NET TraceWriter и WebJobs TraceWriter, который дал мне простой способ отладить локальный с помощью стандартного трассировки .NET TraceWriter, а затем щелкнуть по журналу Azure для публикации. –

+1

с использованием Microsoft.Azure.WebJobs.Host локально с визуальной студией не работает. но при развертывании он делает это. – raklos

4

В качестве обновления Azure функции теперь поддерживает потребляя ILogger вместо TraceWritter, чтобы вы могли потреблять любые рамки протоколирования, реализующие ILogger.

См. GitHub issue и последующие wiki documentation.

4

Если я прав, то необходимыми версиями для получения ILogger для работы с функциями Azure будет Microsoft.Azure.WebJobs 2.1.0-beta1. Тем не менее, я не могу заставить Azure работать с использованием ILogger вместо TraceWriter.

Также имеется небольшая информация и документация о разработке Azure Functions с использованием ILogger. У кого-нибудь есть дополнительная информация или советы, чтобы заставить это работать?

Мой C# фрагмент кода:

using Microsoft.Azure.WebJobs; 
using Microsoft.Azure.WebJobs.ServiceBus; 
using System; 
using Newtonsoft.Json; 
using Microsoft.Extensions.Logging; 

namespace Experimental.Functions 
{ 
    public static class ListenToEventFunction 
    { 
     [FunctionName("ListenToEventFunction")] 
     public static void Run([EventHubTrigger("events", Connection = "EventHubConnectionString")]string myEventHubMessage, ILogger log) 
     { 
      log.LogInformation($"C# Event Hub trigger function processed a message: {myEventHubMessage}"); 
     } 
    } 
} 

Я получаю следующее сообщение об ошибке при отладке моего Azure функции с помощью Azure Функциональных инструментов для VS2017:

A ScriptHost error has occurred 
Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.EnrichTelemetryLocation'. 
Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'log' to type ILogger. 
Make sure the parameter Type is supported by the binding. 
If you're using binding extensions (e.g. ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. config.UseServiceBus(), config.UseTimers(), etc.).