当前位置: 首页 > 知识库问答 >
问题:

扩展测井遥测的应用

谭泉
2023-03-14

我正在移动net4。8应用程序到net50,其中一部分工作是重构来自Microsoft的日志记录。企业图书馆ILogger。我想将现有的结构化日志数据传递给ApplicationInsights。

称之为:

logger.LogInformation("My message called with {p1} and {p2}", p1, p2);

生成应用程序洞察数据,包括p1p2-yay的自定义维度。

称之为:

logger.Log(LogLevel.Information, 
  new EventId(127, "CustomLog"), 
  new CustomLogEntry(), 
  null, 
  (entry, ex) => { return "Testing custom"; });

在哪里:

public class CustomLogEntry
{
    public int Id { get; set; } = 128;
    public string Name { get; set; } = Guid.NewGuid().ToString();
    public DateTimeOffset Expiration { get; set; } = DateTimeOffset.UtcNow.AddDays(1);
}

不会在Application Insights中生成任何CustomLogEntry属性。

所以CustomLogEntryILogger的TState参数。日志接口。这只是一个模拟;我真正想利用的是微软的等价物。实践。企业图书馆。伐木。LogEntry.

我的下一步是设置自定义ITelemetryInitializer,将CustomLogEntry属性添加到我的ITelemetry

public class EventTelemetryInitializer : ITelemetryInitializer
{

    public EventTelemetryInitializer()
    { }

    public void Initialize(ITelemetry telemetry)
    {
        var trace = telemetry as TraceTelemetry;
        if (trace == null) return;
        trace.Properties.Add("Custom", "something");
            
    }
}

当我调试在EventTelemetry初始化器。初始化方法时,遥测参数的任何部分似乎与ILogger的TState参数没有任何连接。日志(在本例中为CustomLogEntry)。

我必须使用格式将自定义维度传递给Application Insights吗?例如,代替:

logger.Log(LogLevel.Information, new EventId(127, "CustomLog"), new CustomLogEntry(), null, (entry, ex) => { return "Testing custom"; });

使用:

var entry = new CustomLogEntry();
logger.LogInformation("Testing custom {Name}, {Expiration}, {Id}", entry.Name, entry.Expiration, entry.Id);

如果是这样,我倾向于发明一点扩展糖到ILogger,但这感觉就像我把糖放在糖上,并且在从ILogger到Application Insight遥测的映射中缺少了一些东西。

共有1个答案

高砚
2023-03-14

当您使用独立包时,远程客户端不会注入到DI容器中,因此您需要创建一个新的远程客户端实例,并使用与记录器提供程序相同的配置,如下所示。这确保了相同的配置用于所有自定义遥测以及来自ILogger的遥测。

public class MyController : ApiController
{
   // This TelemetryClient can be used to track additional telemetry using TrackXXX() api.
   private readonly TelemetryClient _telemetryClient;
   private readonly ILogger _logger;

   public MyController(IOptions<TelemetryConfiguration> options, ILogger<MyController> logger)
   {
        _telemetryClient = new TelemetryClient(options.Value);
        _logger = logger;
   }  
}

ApplicationInsightsLogger提供程序捕获ILogger日志并从中创建TraceTelemetry。如果将Exception对象传递给ILogger上的Log方法,则会创建ExceptionTelemetry而不是TraceTelemetry。这些遥测项目可以在与任何其他TraceTelemetry或ExceptionTeletry for Application Insights相同的位置找到,包括门户、分析或Visual Studio本地调试器。

如果希望始终发送TraceTelemetry,请使用以下代码段:

builder.AddApplicationInsights(
    options => options.TrackExceptionsAsExceptionTelemetry = false);

您可以参考手动记录一些其他自定义遥测和使用Azure Application Insights记录自定义遥测

 类似资料:
  • 我希望我们的分布式事件日志记录具有适当的相关性。对于我们的Web应用程序来说,这似乎是自动的。应用程序服务API中的相关日志示例: 然而,对于我们的其他(非ASP,非WebApp)服务,如果我们使用的是Log4Net,而App Insights附加的日志是不相关的。我尝试了以下说明:https://docs.microsoft.com/en-us/azure/azure-monitor/app/c

  • 问题内容: 标题应该很漂亮。 出于调试目的,我想表达为每个服务请求打印响应代码和正文。打印响应代码很容易,但是打印响应主体比较棘手,因为似乎响应主体不容易用作属性。 以下内容不起作用: 当然,我可以轻松地在发出请求的客户端上打印响应,但是我也希望在服务器端进行打印。 PS:如果有帮助,我的所有回复都是json,但希望有一个可以与一般回复配合使用的解决方案。 问题答案: 不确定这是否是最简单的解决方

  • 有没有一种方法可以让fluentd船LivenessProbes输出像它对普通容器在吊舱中的输出一样?

  • 努力更新中...

  • 我正在使用设置为log level=INFO的wildfly21。在部署的代码中有许多记录器。调试语句。 例如 调试语句没有正确记录到文件中,因为日志记录级别设置为INFO。 我的问题是关于logger的性能成本。调试。 在代码中保留调试语句是否有任何性能代价。或者是文件I/O中的实际成本,因此,在需要时将调试语句留作故障排除之用并无害处。

  • 下面的问题对很多人来说可能很愚蠢,因为它应该有一个简单的解决方案,但我是Spring框架的初学者,我一直在搜索和测试许多方法,但都没有成功。 因此,我需要实现基于Spring的Web服务的日志记录。Maven用于依赖项,带有依赖项,而不是整个starter web starter。 我尝试使用log4j,添加了一个依赖项和配置文件,它确实生成了一个日志文件,但只用于记录器本身的初始化,并且没有记录