C# 具有应用程序洞察目标的NLog不';t记录自定义参数和异常

C# 具有应用程序洞察目标的NLog不';t记录自定义参数和异常,c#,.net,azure,nlog,azure-application-insights,C#,.net,Azure,Nlog,Azure Application Insights,我在WebJobs项目中将Nlog与Application Insights一起用作记录遥测的目标。如果我像下面那样记录消息,一切似乎都正常 _logger.Log(LogLevel.Info, "Job completed"); _logger.Info($"Job created successfully", req.UserId, req.ReportName, jobId, searchString); 我可以在application insights中看到带有消息“作业已完成”的跟

我在WebJobs项目中将Nlog与Application Insights一起用作记录遥测的目标。如果我像下面那样记录消息,一切似乎都正常

_logger.Log(LogLevel.Info, "Job completed");
_logger.Info($"Job created successfully", req.UserId, req.ReportName, jobId, searchString);
我可以在application insights中看到带有消息“作业已完成”的跟踪信息

但是我想在下面的消息中记录一些参数

_logger.Log(LogLevel.Info, "Job completed");
_logger.Info($"Job created successfully", req.UserId, req.ReportName, jobId, searchString);
或者像下面这样

catch (Exception ex)
{
    _logger.Error(ex, "Error creating the job", req.UserId, req.ReportName, searchString);
    throw;
}
我希望application insights中包含我随消息传递的参数的跟踪。但我只能看到消息,而不能看到任何参数或异常详细信息

我错过了什么

编辑:

NLog nuget版本4.3.8和 Microsoft.ApplicationInsights.NLogTarget nuget版本2.4.1

更多代码:

try
{
    var jobId = _reportingService.RequestReport(req.ReportName, searchString).Result;

    _logger.Info($"Job created successfully", req.UserId, req.ReportName, jobId, searchString);

    var output = new RetrieveReportDataRequest()
    {
        CreationRequest = new ReportCreationRequest()
        {
            ImmutableUserId = req.UserId,
           ...
        },
        SearchParameters = searchString,
        JobId = jobId,
        Created = DateTime.UtcNow,
    };

    outputQueueMessage = JsonConvert.SerializeObject(output, settings);
}
catch (Exception ex)
{
    log.WriteLine(ex.Message);
    _logger.Error(ex, "Error creating the job", req.UserId, req.ReportName, searchString);
    throw;
}

您可以使用LogEventInfo,然后在其属性中添加参数

示例代码:

有关日志级别信息:

            LogEventInfo eventInfo = new LogEventInfo(LogLevel.Info, "event1", "this is a info111");
            eventInfo.Properties["myname"]= "myname is ddd";
            eventInfo.Properties["myid"] = "myid is ddd";
            eventInfo.Properties["myjobid"] = "myjobid is ddd";
            log.Log(eventInfo);
对于错误日志级别:

        #in you code, you can change the new Exception() to your own exception
        LogEventInfo eventinfo2 = new LogEventInfo(LogLevel.Error, null,null,null,null,new Exception("anexception222"));
        eventinfo2.Properties["errormessage"] = "thi si a error message";
        eventinfo2.Properties["myname"] = "myname is ddd";
        eventinfo2.Properties["myid"] = "myid is ddd";
        eventinfo2.Properties["myjobid"] = "myjobid is ddd";
        log.Log(eventinfo2);
然后,您可以在azure portal中查看参数:


另一个可能更简单的选择是使用结构化日志记录

e、 g

这将创建事件属性JobId、User、ReportName和Search

另见


注意:所以在这种情况下不要使用插值字符串

这是一个webjob项目?你能再加一些代码吗?您正在使用的nuget包包括这个版本。谢谢。@IvanYang我已经编辑了这个问题并提供了更多详细信息。您好,您使用的是webjobs nuget软件包3.0.x或2.x?@IvanYang webjobs nuget版本是2.1。0@PNDev您可以实现自己的记录器,就像我们在工作区中所做的那样。如果你不知道如何让我知道,我可以提供一个例子作为回答谢谢伊万。这很有效。但是你知道为什么在这种情况下不使用LogEventInfo而使用objects数组的方法不起作用吗?@PNDev,猜猜看,也许appInsights没有实现它。几年前,appInsights中甚至不支持LogEventInfo.Properties作为属性。这促使他们实施它。