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

log4net遥测相关的应用研究

伯逸明
2023-03-14

我希望我们的分布式事件日志记录具有适当的相关性。对于我们的Web应用程序来说,这似乎是自动的。应用程序服务API中的相关日志示例:

然而,对于我们的其他(非ASP,非WebApp)服务,如果我们使用的是Log4Net,而App Insights附加的日志是不相关的。我尝试了以下说明:https://docs.microsoft.com/en-us/azure/azure-monitor/app/correlation

如有任何关于如何使用log4net实现这一点的帮助,我们将不胜感激。

干杯!

共有1个答案

郎鹤龄
2023-03-14

跨服务相关性ID大多通过头传播。当为Web应用程序启用AI时,它从传入的头中读取IDS/Context,然后用适当的IDS/Context更新传出的头。在服务内部,使用活动对象跟踪操作,发出的每一个遥测都将与该活动相关联,从而共享必要的相关ID。

在服务总线/事件集线器通信的情况下,在最近的版本中也支持传播(IDS/Context作为元数据传播)。

如果服务不是基于Web的,并且AI自动关联传播不起作用,您可能需要手动从某些元数据中获取传入的ID信息(如果存在的话),恢复/启动活动,用此活动启动AI操作。当遥测项目在该活动范围内生成时,它将获得适当的ID,并将成为总体跟踪的一部分。这样,如果遥测是从在AI操作上下文范围内执行的Log4net跟踪生成的,那么该遥测应该得到正确的ID。

从标头访问相关性的代码示例:

public class ApplicationInsightsMiddleware : OwinMiddleware
{
    // you may create a new TelemetryConfiguration instance, reuse one you already have
    // or fetch the instance created by Application Insights SDK.
    private readonly TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.CreateDefault();
    private readonly TelemetryClient telemetryClient = new TelemetryClient(telemetryConfiguration);

    public ApplicationInsightsMiddleware(OwinMiddleware next) : base(next) {}

    public override async Task Invoke(IOwinContext context)
    {
        // Let's create and start RequestTelemetry.
        var requestTelemetry = new RequestTelemetry
        {
            Name = $"{context.Request.Method} {context.Request.Uri.GetLeftPart(UriPartial.Path)}"
        };

        // If there is a Request-Id received from the upstream service, set the telemetry context accordingly.
        if (context.Request.Headers.ContainsKey("Request-Id"))
        {
            var requestId = context.Request.Headers.Get("Request-Id");
            // Get the operation ID from the Request-Id (if you follow the HTTP Protocol for Correlation).
            requestTelemetry.Context.Operation.Id = GetOperationId(requestId);
            requestTelemetry.Context.Operation.ParentId = requestId;
        }

        // StartOperation is a helper method that allows correlation of 
        // current operations with nested operations/telemetry
        // and initializes start time and duration on telemetry items.
        var operation = telemetryClient.StartOperation(requestTelemetry);

        // Process the request.
        try
        {
            await Next.Invoke(context);
        }
        catch (Exception e)
        {
            requestTelemetry.Success = false;
            telemetryClient.TrackException(e);
            throw;
        }
        finally
        {
            // Update status code and success as appropriate.
            if (context.Response != null)
            {
                requestTelemetry.ResponseCode = context.Response.StatusCode.ToString();
                requestTelemetry.Success = context.Response.StatusCode >= 200 && context.Response.StatusCode <= 299;
            }
            else
            {
                requestTelemetry.Success = false;
            }

            // Now it's time to stop the operation (and track telemetry).
            telemetryClient.StopOperation(operation);
        }
    }

    public static string GetOperationId(string id)
    {
        // Returns the root ID from the '|' to the first '.' if any.
        int rootEnd = id.IndexOf('.');
        if (rootEnd < 0)
            rootEnd = id.Length;

        int rootStart = id[0] == '|' ? 1 : 0;
        return id.Substring(rootStart, rootEnd - rootStart);
    }
}

用于单独跟踪手动相关操作的代码示例:

async Task BackgroundTask()
{
    var operation = telemetryClient.StartOperation<DependencyTelemetry>(taskName);
    operation.Telemetry.Type = "Background";
    try
    {
        int progress = 0;
        while (progress < 100)
        {
            // Process the task.
            telemetryClient.TrackTrace($"done {progress++}%");
        }
        // Update status code and success as appropriate.
    }
    catch (Exception e)
    {
        telemetryClient.TrackException(e);
        // Update status code and success as appropriate.
        throw;
    }
    finally
    {
        telemetryClient.StopOperation(operation);
    }
}

请注意Application Insights SDK的最新版本正在切换到W3C相关标准,因此头名和预期格式将根据W3C规范有所不同。

 类似资料:
  • 我们正在为我们的应用程序设置Azure主机,应用程序Insights正在为其标准的遥测收集增加很多价值。我们现在正在评估将log4net日志重定向到应用洞察中,并逐步使AI成为日志聚合器。 MS发布了一个log4net AI appender-https://www.nuget.org/packages/microsoft.applicationinsights.log4netappender 我

  • 我正在移动应用程序到,其中一部分工作是重构来自至。我想将现有的结构化日志数据传递给ApplicationInsights。 称之为: 生成应用程序洞察数据,包括和-yay的自定义维度。 称之为: 在哪里: 不会在Application Insights中生成任何属性。 所以是接口。这只是一个模拟;我真正想利用的是微软的等价物。实践。企业图书馆。伐木。LogEntry. 我的下一步是设置自定义,将属

  • 我正在尝试配置我的azure ASP.NET网站,以便将log4net跟踪发送到azure Application Insights。我可以看到在我的azure控制台页面视图等,因此我知道这是工作良好的。当配置了文件处理程序时,我还可以看到log4net跟踪,但是当配置log4net以使用application insights处理程序时,我没有看到任何log4net条目出现在applicatio

  • 项目状态 截至2020年4月1日,Log4Net是Apache Logging Services的一个休眠项目。休眠状态表示该项目被归类为非活动状态,因为它没有近期的开发活动,并且没有活动的志愿者来执行代码审查,提交代码或执行发布。尽管志愿者可能会选择参加将来的活动,但最好假定将来不会有任何开发或发布。 介绍 log4net是一个可以帮助程序员把日志信息输出到各种 不同目标的.net类库。它可以容

  • 本文向大家介绍详解log4net的使用,包括了详解log4net的使用的使用技巧和注意事项,需要的朋友参考一下 程序中只需要引用log4net.dll文件即可 配置的引用 首先添加以上代码。 CS程序:在Main方法中添加; BS程序:Application_Start方法中添加; 或是两者都可以在AssemblyInfo.cs(Properties中)文件里添加以下的语句: 详细配置 log4n

  • 这个例子演示了如何使用Istio Mixer和Istio Sidecar,从多个服务中获取一致的指标、日志、跟踪信息。 概述 把微服务应用部署到Istio Service Mesh集群上,就可以在外部控制服务的监控、跟踪、(版本相关的)请求路由、弹性测试、安全和策略增强等,并且可以跨越服务界限,从整个应用的层面进行管理。 本文将会使用Bookinfo示例应用,展示在无需开发改动代码的情况下,运维人