Запись функции Azure с использованием TraceWriter во внешней библиотеке

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

Ответы

Ответ 1

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

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

Длинная версия

Ваша проблема в том, что вы используете неправильный 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 создает сценарий GitHub repo, а затем на пакет Nuget, Я протестировал это, и он отлично работает, чтобы передать регистратор функций Azure в вашу внешнюю сборку и продолжить доступ к среде Azure Function.

Вот пример:

using Microsoft.Azure.WebJobs.Host;

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

Мне нравится потенциал лазурных функций, но он все еще немного незрелый и чрезмерно сложный.

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

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

Он записывает либо Logger Function Logger, либо стандартный System.Diagnostics.Trace. Вам нужно вставить это содержимое содержимого Program.cs стандартного консольного приложения С#. Вам также потребуется включить пакет 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();
        }
    }
}

Ответ 2

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

Смотрите выпуск GitHub и последующую вики документацию.

Ответ 3

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

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

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

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 Function с помощью Azure Function Tools для 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.).