Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TelemetryClient的静态实例和应用程序细节_C#_Logging_Azure Application Insights - Fatal编程技术网

C# 使用TelemetryClient的静态实例和应用程序细节

C# 使用TelemetryClient的静态实例和应用程序细节,c#,logging,azure-application-insights,C#,Logging,Azure Application Insights,我有一个ASP.NETMVC网站,我正在实施应用程序洞察。现在,我记录一个跟踪事件,如下所示: private static TelemetryClient _APM; private static TelemetryClient APM { get { if (_APM == null) { _APM = new TelemetryClient(); } return _APM; } } public static void Trace

我有一个ASP.NETMVC网站,我正在实施应用程序洞察。现在,我记录一个跟踪事件,如下所示:

private static TelemetryClient _APM;
private static TelemetryClient APM
{
    get
    {
        if (_APM == null) { _APM = new TelemetryClient(); }
        return _APM;
    }
}

public static void Trace(string Message)
{
    APM.TrackTrace(Message);
}
如您所见,这将为所有跟踪维护遥测客户端的单个静态实例。这就是我们使用客户机的方式吗?或者我们应该为每个日志创建一个新的遥测客户端实例吗?

根据您应该:

。。。为应用程序的每个模块使用遥测客户端实例。例如,您的web服务中可能有一个遥测客户端用于报告传入的http请求,而中间件类中的另一个用于报告业务逻辑事件


为每个日志创建一个新的遥测客户端可能很昂贵,因此根据应用程序的结构,您可能正确地使用您在文章中描述的单例模式。

达斯·菲尼克斯引用的完整引用实际上是:

遥测客户端是线程安全的

对于ASP.NET和Java项目,将自动捕获传入的HTTP请求。您可能希望为应用程序的其他模块创建遥测客户端的其他实例。例如,您的中间件类中可能有一个遥测客户端实例来报告业务逻辑事件。您可以设置诸如UserId和DeviceId之类的属性来标识机器。此信息附加到实例发送的所有事件

TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";
最后一点非常重要。如果您正在编写类似web应用程序的东西,其中用户ID可能会发生更改,那么您可能应该为每个作用域重用遥测客户端的实例,在每个作用域中,这些值都是相同的(如每个请求),但不能作为静态/单例实例

更新 在ASP.NET Core中,Application Insights大量使用依赖项注入,并将遥测客户端注册为单例


这意味着您应该避免在客户端上下文中设置不希望在整个应用程序中使用的变量,而是利用遥测初始值设定项在每个遥测对象上设置用户ID之类的内容。

Perfect!那正是我要找的!您可以这样做,但是对于服务器应用程序或ASP.Net,您可能不希望使用静态
遥测客户端。如果使用静态单例,则遥测记录的一些上下文字段(用户、会话、操作)都将预先设置一次。使用新的遥测客户端将(尝试)从asp.net管道继承user/session/etc,这可以帮助您在查看跟踪时诊断发生了什么。在门户中,您将能够在跟踪发生时的同一会话中查看所有遥测。或者是哪个asp.net请求导致了跟踪。正在添加到@JohnGardner注释。。。使用单例/静态不是很明显是错误的吗?例如,请求1,我们设置了
AuthenticatedUserId=“jon”
,然后它在通过我们的单例程序的所有日志中都有“jon”,但请求2立即出现,我们设置了
AuthenticatedUserId=“matt”
,现在它与所有下一个日志绑定。这种情况会不会发生/不断地翻转每个请求设置的值?