Application Insight配置存在一些混淆。它可以使用Visual Studio在应用程序本身中配置,也可以在使用Azure门户的App Service中配置。
当我使用Visual Studio add Application Insights Telemetry到我的asp.net core 2.0网站时,它将以下配置添加到appsettings.json:
{
// Changes to file post adding Application Insights Telemetry:
"ApplicationInsights": {
"InstrumentationKey": "10101010-1010-1010-1010-101010101010"
}
}
然后我在startup.cs中配置AppInsights服务,如下所示:
var instrumentationKey= Configuration.GetSection("ApplicationInsights:InstrumentationKey").Value;
services.AddApplicationInsightsTelemetry(opt => opt.InstrumentationKey = instrumentationKey);
但是,当我在Azure门户的App Service中打开Application Insights选项卡时,它仍建议连接Application Insight。然后,向导会在配置中添加新的Intrumentation Key:
仅使用APPINSIGHTS_INSTRUMENTATIONKEY有什么副作用(例如在Visual Studio工具中)。我的意思是我会在startup.cs中写:
var instrumentationKey= Configuration.GetSection("APPINSIGHTS_INSTRUMENTATIONKEY ").Value;
services.AddApplicationInsightsTelemetry(opt => opt.InstrumentationKey = instrumentationKey);
我根据Tseng的回答得出结论,最好在Azure门户网站和appsettings.json中同时使用APPINSIGHTS_INSTRUMENTATIONKEY。
ASP.NET Core同时理解APPINSIGHTS_INSTRUMENTATIONKEY
和ApplicationInsights:InstrumentationKey
,但Azure Portal只是第一个,它必须是环境变量。如果您使用了第二个,并尝试从代码中的某个位置读取它,您可以轻松地在Azure门户和在Azure中运行的应用程序中使用不同的值。
此外,如果您是从配置中手动阅读检测密钥,则应首先查看APPINSIGHTS_INSTRUMENTATIONKEY
,然后查看ApplicationInsights:InstrumentationKey
:
var instrumentationKey= Configuration.GetSection("APPINSIGHTS_INSTRUMENTATIONKEY")?.Value
?? Configuration.GetSection("ApplicationInsights:InstrumentationKey")?.Value;
因为services.AddApplicationInsightsTelemetry(Configuration);
的工作原理。以防万一Azure Portal中的设置键与appsettings.json中的设置键不同
答案 0 :(得分:3)
嗯,第一个是当您不在Azure App Service上托管或者您不想设置环境变量时。实际使用哪一个取决于配置构建器的配置方式。
通常,您在Startup.cs
或Programm.cs
中有类似内容:
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddUserSecrets<Startup>()
.AddEnvironmentVariables(); // Environment Variables override all other
使用.AddXxx
来电的顺序很重要。将使用具有匹配键的最后一次注册。这里.AddEnvironmentVariables()
是最后一个。设置APPINSIGHTS_INSTRUMENTATIONKEY
变量后,它将覆盖用户机密Appinsights:InstrumentationKey
或appsettings.Development.json
中设置的appsettings.json
的所有值。
如果未设置APPINSIGHTS_INSTRUMENTATIONKEY
,配置库将查看用户机密并在找到时使用它。如果找不到,则会搜索appsettings.Development.json
,如果它不包含值搜索appsettings.json
。
TL; DR :只有在未设置环境变量时才会使用一个表单appsettings.json。
如the code所示,注册它的Application Insight扩展方法将在找到匹配的条目时覆盖环境变量或appsettings.json中的值。
注意:当您删除.AddEnvironmentVariables()
赢得时,使用Azure门户中设置的值,因为.AddEnvironmentVariables()
使用键APPINSIGHTS_INSTRUMENTATIONKEY
将环境变量加载到配置中(参见下文)。
private const string InstrumentationKeyFromConfig = "ApplicationInsights:InstrumentationKey";
private const string InstrumentationKeyForWebSites = "APPINSIGHTS_INSTRUMENTATIONKEY";
当在那里找不到它时,它会尝试appsettings.json ApplicationInsights:InstrumentationKey
中的常规键。
在你的例子中
var instrumentationKey= Configuration.GetSection("APPINSIGHTS_INSTRUMENTATIONKEY ").Value;
services.AddApplicationInsightsTelemetry(opt => opt.InstrumentationKey = instrumentationKey);
传递的值不会被使用,除非您同时删除环境变量(或.AddEnvironmentVariables()
) AND 从{{删除条目1}}。
因此对于大多数常见配置,它足以调用
appsettings.json
其中services.AddApplicationInsightsTelemetry(Configuration);
是Configuration
。此重载将从环境变量或appsettings.json(如果找到)加载它。
如果您想对它进行更多编程控制,请使用
IConfigurationRoot
答案 1 :(得分:0)
简短答案:
Azure门户中的 APPINSIGHTS_INSTRUMENTATIONKEY
优先于appsettings.json
中的ApplicationInsights InstrumentationKey 。
您可以使用APPINSIGHTS_INSTRUMENTATIONKEY 覆盖 appsettings.json的设置。
您在Azure门户中不应同时拥有。