Azure函数在外部库中使用TraceWriter进行日志记录

时间:2016-11-02 22:57:44

标签: c# logging azure-webjobs azure-functions

如何重用azure函数中可用的TraceWriter对象来记录外部引用库中的信息?我尝试使用构造函数传入对象并引用TraceWriter类(web.http.tracing)。我没有运气,因为课程看起来不同。

3 个答案:

答案 0 :(得分:37)

简短版 使用this nuget package中提供的Microsoft.Azure.WebJobs.Host.TraceWriter。

或者,将您的功能构建为Web项目,您可以在本地进行调试。 You can find a sample here

长版

你的问题是你使用错误的TraceWriter。

我在Azure函数中使用Azure Function记录器来输出记录器的类型。

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

其中包含以下内容:

  

Microsoft.Azure.WebJobs.Script.InterceptingTraceWriter

我也期待着一个Web / Http TraceWriter,并且还惊讶于还有另一个实现要处理。微软可以真正做到创建一个标准的方法,或至少给我们一个漂亮的干净,错误,警告,信息,详细等界面。也许.Net标准...请。

我将创建自己的界面并包装我的应用程序记录器和Azure,以便我可以注入我需要的任何一个而不会在我的代码中进一步引起麻烦。这也将为未来突破性变化带来的潜在痛苦提供一些保护。

无论如何,我离题了,然后我跟踪Microsoft.Azure.WebJobs.Script.InterceptingTraceWriter向下到Azure Functions / Webjobs scripting GitHub repo,然后到Nuget包。我已对此进行了测试,并且可以将Azure功能记录器传递到外部程序集并继续从那里登录到Azure功能环境。

以下是一个例子:

using Microsoft.Azure.WebJobs.Host;

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

我喜欢Azure功能的潜力,但它仍然有点不成熟且过于复杂。

我希望这会有所帮助。

添加了一个非常简单的单类记录器来说明。

它写入Azure Functions Logger或标准的Systems.Diagnostics.Trace。您需要将其粘贴到标准C#控制台应用程序的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();
        }
    }
}

答案 1 :(得分:9)

作为更新,Azure Functions现在支持使用ILogger而不是TraceWritter,因此您可以使用任何实现ILogger的日志记录框架。

请参阅GitHub issue和随后的wiki documentation

答案 2 :(得分:5)

如果我是正确的,那么让ILogger与Azure功能一起使用的必要版本将是Microsoft.Azure.WebJobs 2.1.0-beta1。但是,我似乎无法使用ILogger而不是TraceWriter运行Azure函数。

关于使用ILogger开发Azure功能的信息和文档也非常少。有没有人有更多的信息或提示让这个工作?

我的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功能工具VS2017调试Azure功能时出现以下错误:

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.).
相关问题