如何让NLog输出显示在Azure功能的流日志中?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (11)

我有一个简单的Azure功能,我希望能够在流日志窗口和Application Insights中监视日志输出。

到目前为止,我能够在Application Insights中看到NLog输出,但不能在流窗口中看到。Microsoft ILogger输出同时出现在两者中。

这是我到目前为止所做的:

  • 创建了一个基本的Azure测试功能
  • 在Azure门户中,我启用了Application Insights
  • 为该函数安装了NLogMicrosoft.ApplicationInsights.NLogTarget nuget依赖项。
  • 添加了函数代码,以编程方式创建Application Insights nlog目标。
  • 阅读完这些问题后...... Azure日志流与NLog以及如何集成NLog将日志写入Azure流日志我还以编程方式添加了NLog TraceTarget,因为他们建议流日志机制只显示Trace输出流(不是与称为“跟踪”的日志级别混淆!)
  • 最后,我修改了host.json以将默认日志记录级别更改为“Trace”。这是流式窗口显示Microsoft ILogger的跟踪级输出所必需的,我原以为这可能是Nlog输出没有显示的原因...... { "version": "2.0", "logging": { "logLevel": { "default": "Trace" } } }

到目前为止,结果是:

  • 所有Microsoft记录器输出都显示在流窗口和Application Insights日志中。
  • 该NLOG输出显示在应用洞察但不是出现在流窗口。

这是最终的功能代码......

public static class Function1
{
    [FunctionName("LogTest")]
    public static void Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
    {
        // Set up NLOG targets and logger
        var config = new LoggingConfiguration();
        //send logging to application insights     
        config.LoggingRules.Add(
          new LoggingRule("*", LogLevel.Trace, 
          new ApplicationInsightsTarget()));
        //also try to log to Trace output 
        //'RawWrite' is used to try and force output at all log-levels  
        config.LoggingRules.Add(
          new LoggingRule("*", LogLevel.Trace, 
          new TraceTarget {RawWrite = true}));

        LogManager.Configuration = config;
        var nlog = LogManager.GetLogger("Example");

        //log using native
        log.LogInformation($"log:Info"); //appears in live-stream, app-insights
        log.LogError("log:Error");       //appears in live-stream, app-insights
        log.LogTrace("log:Trace");       //appears in live-stream, app-insights (after modifying host.json)

        //log using nlog
        nlog.Info("nlog:info");          //appears in ...........  app-insights
        nlog.Error("nlog:error");        //appears in ...........  app-insights
        nlog.Trace("nlog:trace");        //appears in ...........  app-insights                     

        //say goodbye
        log.LogInformation("log:ending");
    }
}

提前感谢任何建议 - 毫无疑问,我错过了一些简单的步骤。

提问于
用户回答回答于

感谢Rolf Kristensen提供的链接 ,似乎解决方案是使用MicrosoftILoggerTarget而不是使用而不是配置新规则TraceTarget

所以完整的代码是

var config = new LoggingConfiguration();
//ensure that log output is seen in the Streamed Log window
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, 
     new MicrosoftILoggerTarget(azureLog)));
//ensure that log output is sent to Application Insights
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, 
     new ApplicationInsightsTarget()));
LogManager.Configuration = config;
var nlog = LogManager.GetLogger("Example");
nlog.Info("output from nlog");

其中azureLog是ILogger为函数的Run方法提供的。

MicrosoftILoggerTarget 可以在NLog.Extensions.Logging nuget包中找到。

所属标签

可能回答问题的人

  • 天使的炫翼

    15 粉丝531 提问35 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    48 粉丝0 提问27 回答
  • 富有想象力的人

    2 粉丝0 提问26 回答
  • 发条丶魔灵1

    6 粉丝525 提问25 回答

扫码关注云+社区

领取腾讯云代金券