将Azure Application Insights集成至共享项目并通过Serilog写日志是否可行
问题解答
关于是否可以集中到共享项目实现
- 完全可以,这是非常合理的公共逻辑封装方式,和你封装Serilog Logger类的思路一致,没有任何技术阻碍。
- 具体实现步骤:
- 先在Mat2.Common项目中安装所需NuGet包:
Serilog.Sinks.ApplicationInsights、Microsoft.ApplicationInsights.Core - 改造现有Logger类,新增静态初始化方法,接收Application Insights连接字符串、服务标识(用来区分日志来自MVC网站还是Web API)作为入参,在LoggerConfiguration配置链中添加Application Insights的Sink即可,参考改造代码:
- 先在Mat2.Common项目中安装所需NuGet包:
public class Logger { private static ILogger _logger; // 新增初始化方法,由各个调用项目在启动时调用 public static void Init(string appInsightsConnectionString, string serviceName) { _logger = new LoggerConfiguration() .Enrich.WithProperty("ServiceName", serviceName) // 区分日志来源 // 保留你原来所有的Enrich配置 .Enrich.WithUserName(anonymousUsername: "Not Authenticated") .Enrich.FromLogContext() .Enrich.With(new ThreadEnrich()) .Enrich.WithMachineName() .Enrich.WithHttpRequestId() .Enrich.WithHttpRequestNumber() .Enrich.WithHttpRequestClientHostIP() .Enrich.WithHttpRequestType() .Enrich.WithHttpRequestRawUrl() .Enrich.WithMvcRouteData() .Enrich.WithExceptionDetails( new DestructuringOptionsBuilder() .WithDefaultDestructurers()) // 保留原有本地文件写入配置 .WriteTo.RollingFile(new JsonFormatter(), HttpContext.Current.Server.MapPath($"~/logs/log-.json"), LogEventLevel.Debug, fileSizeLimitBytes: 655360) // 新增Application Insights写入配置 .WriteTo.ApplicationInsights(appInsightsConnectionString, TelemetryConverter.Events) .CreateLogger(); } // 保留你原来的所有LogXX方法不变 public static void LogInformation(string info, object[] data = null) { _logger.Information(info, data); } public static void LogDebug(string debug, object[] data = null) { _logger.Debug(debug, data); } public static void LogWarning(string warning, object[] data = null, Exception e = null) { _logger.Warning(e, warning, data); } public static void LogError(Exception e, string error, object[] data = null) { _logger.Error(e, error, data); } }
- 各个业务项目(MVC网站、Web API)只需要在启动入口(Global.asax的Application_Start方法中)调用一次初始化方法即可,不需要再单独配置Application Insights相关逻辑:
比如MVC项目的Global.asax里加:
Logger.Init(ConfigurationManager.AppSettings["AppInsightsConnString"], "Mat2.MvcWebsite");
Web API项目的Global.asax里加:
Logger.Init(ConfigurationManager.AppSettings["AppInsightsConnString"], "Mat2.WebApi");
对应的配置文件里加上连接字符串的配置项即可。
- 额外说明:你可以根据需要选择两个项目用同一个Application Insights资源(连接字符串相同),也可以用不同的资源,只需要对应修改配置项里的连接字符串即可,封装逻辑不需要改动。
关于微软是否允许这种使用方式
- 完全允许,没有任何使用限制。
- 首先纠正一个认知误区:Application Insights没有要求每个接入项目必须单独购买资源,本身就支持多服务、多应用向同一个Application Insights实例上报数据,收费只和你实际上报的遥测数据量、保留时长、采样率等实际用量相关,和接入的项目数量无关。
- 你这种把公共配置逻辑封装到共享类库的做法属于非常常规的开发优化,完全符合微软的使用规范,不存在合规问题。
内容的提问来源于stack exchange,提问作者Junaid
相关产品推荐
相关产品推荐

