如何在入口为global.asax.cs的ASP.NET 4.8 Web应用配置Application Insights并分离日志
ASP.NET 4.8(global.asax.cs)配置Application Insights + 独立日志项目集成方案
一、Web项目配置Application Insights
先给Web项目装上必要的NuGet包,完成基础配置:
- 安装NuGet包:
Microsoft.ApplicationInsights.Web、Microsoft.Extensions.Logging、Microsoft.Extensions.Logging.ApplicationInsights - 配置Instrumentation Key:
推荐在Web.config的appSettings节点里添加,方便后续修改:<appSettings> <add key="APPINSIGHTS_INSTRUMENTATIONKEY" value="你的Instrumentation Key" /> </appSettings> - 在global.asax.cs的
Application_Start方法里初始化Application Insights:
装了protected void Application_Start() { // 从配置文件读取密钥并初始化 var instrumentationKey = System.Configuration.ConfigurationManager.AppSettings["APPINSIGHTS_INSTRUMENTATIONKEY"]; Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey = instrumentationKey; // 原有项目初始化逻辑(比如路由注册) RouteConfig.RegisterRoutes(RouteTable.Routes); }Microsoft.ApplicationInsights.Web后,会自动收集HTTP请求、异常、数据库依赖等数据,不需要额外写代码。
二、创建独立日志类库项目
把日志逻辑抽成独立的类库,方便复用:
- 新建一个**.NET Framework 4.8**的类库项目
- 安装NuGet包:
Microsoft.Extensions.Logging、Microsoft.Extensions.Logging.ApplicationInsights,开发时需要控制台日志的话,再装Microsoft.Extensions.Logging.Console - 写一个日志服务封装类,统一管理LoggerFactory的创建和配置:
using Microsoft.Extensions.Logging; using System; namespace YourLoggingLibrary { public static class LoggingProvider { private static ILoggerFactory _loggerFactory; // 初始化日志服务 public static void Setup(string instrumentationKey) { _loggerFactory = LoggerFactory.Create(builder => { // 添加Application Insights日志提供器,配置自动收集依赖、异常 builder.AddApplicationInsights(instrumentationKey, options => { options.TrackDependencies = true; options.TrackExceptions = true; }); // 开发环境可以加控制台日志,生产环境注释掉即可 builder.AddConsole(); // 设置全局最小日志级别,比如只记录Info及以上 builder.SetMinimumLevel(LogLevel.Information); }); } // 创建指定类型的Logger实例 public static ILogger<T> GetLogger<T>() { if (_loggerFactory == null) { throw new InvalidOperationException("请先调用Setup方法初始化日志服务"); } return _loggerFactory.CreateLogger<T>(); } } }
三、Web项目集成独立日志库
- 在Web项目里添加对日志类库项目的引用
- 回到global.asax.cs的
Application_Start,添加日志服务的初始化:protected void Application_Start() { var instrumentationKey = System.Configuration.ConfigurationManager.AppSettings["APPINSIGHTS_INSTRUMENTATIONKEY"]; // 先初始化日志服务 YourLoggingLibrary.LoggingProvider.Setup(instrumentationKey); // 再初始化Application Insights的全局配置 Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey = instrumentationKey; RouteConfig.RegisterRoutes(RouteTable.Routes); } - 在控制器或业务类里使用日志:
public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController() { _logger = YourLoggingLibrary.LoggingProvider.GetLogger<HomeController>(); } public ActionResult Index() { _logger.LogInformation("用户访问了首页"); try { // 业务逻辑代码 } catch (Exception ex) { _logger.LogError(ex, "处理首页请求时发生异常"); } return View(); } }
四、可选:用配置文件控制日志级别
如果想通过配置文件灵活调整日志级别,可以给日志类库加Microsoft.Extensions.Configuration.Json包,修改初始化逻辑:
- 在Web项目里添加
appsettings.json文件,设置复制到输出目录为“如果较新则复制”,内容如下:{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "YourLoggingLibrary": "Debug" } }, "APPINSIGHTS_INSTRUMENTATIONKEY": "你的Instrumentation Key" } - 修改日志类库的
Setup方法,支持读取配置:using Microsoft.Extensions.Configuration; public static void Setup(IConfiguration configuration) { var instrumentationKey = configuration["APPINSIGHTS_INSTRUMENTATIONKEY"]; _loggerFactory = LoggerFactory.Create(builder => { builder.AddApplicationInsights(instrumentationKey); // 读取配置文件里的日志级别设置 builder.AddConfiguration(configuration.GetSection("Logging")); builder.AddConsole(); }); } - 在Web项目的
Application_Start里初始化Configuration:protected void Application_Start() { var config = new ConfigurationBuilder() .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); YourLoggingLibrary.LoggingProvider.Setup(config); Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey = config["APPINSIGHTS_INSTRUMENTATIONKEY"]; RouteConfig.RegisterRoutes(RouteTable.Routes); }
内容的提问来源于stack exchange,提问作者Vaibhav Meena
相关产品推荐
相关产品推荐

