Asp.Net Core使用Exceptionless日志服务2-集成Exceptionless.NLog
Exceptionless有自己一套完整的Api用于提交日志,我的项目已经写好了,使用Asp.Net Core标准接口ILogger记录日志,然后通过NLog输出到文件和控制台,我不想修改标准的日志接口,幸好有Exceptionless.NLog这样强大的组件,可以直接把NLog日志配置输出到Exceptionless服务。
NuGet安装NLog.Web.AspNetCore、Exceptionless.NLog。
<PackageReference Include="Exceptionless.NLog" Version="5.0.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.2.2" />
有2种方式可以把NLog日志配置输出到Exceptionless服务,可以修改NLog.config配置文件,也可以通过代码配置NLog记录器,殊途同归。
通过NLog.config配置文件上传日志到Exceptionless
在配置文件增加exceptionless记录器,填写项目的秘钥apiKey,Exceptionless服务器地址serverUrl
D:\Software\gitee\testexceptionless\NLog.config
<?xml version="1.0" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true"> <extensions> <!--添加扩展Exceptionless程序集--> <add assembly="Exceptionless.NLog"/> </extensions> <targets async="true"> <!--write logs to Console--> <target name="console" xsi:type="ColoredConsole" layout="${longdate}, ${level:uppercase=true:padding=-5}, ${callsite}, ${message}, ${exception}" /> <!--write logs to Visual Studio Output--> <target name="debugger" xsi:type="Debugger" layout="${longdate}, ${level:uppercase=true:padding=-5}, ${callsite}, ${message}, ${exception}" /> <!--write logs to file--> <target name="file" xsi:type="File" layout="${longdate}, ${level:uppercase=true:padding=-5}, ${callsite}, ${message}, ${exception}" fileName="${basedir}/data/logs/app.log" archiveFileName="${basedir}/data/logs/app.{#}.log" encoding="utf-8" archiveAboveSize="1024000" maxArchiveFiles="10" archiveNumbering="Rolling" concurrentWrites="true" keepFileOpen="false" /> <!--Exceptionless分布式日志--> <target name="exceptionless" xsi:type="Exceptionless" apiKey="xxx" serverUrl="https://www.myweb.cn:8811"> <field name="CallSite" layout="${callsite}"/> </target> </targets> <rules> <!--TRACE,DEBUG,INFO,WARN,ERROR,FATAL--> <logger name="*" minlevel="Info" writeTo="console" /> <logger name="*" minlevel="Debug" writeTo="debugger" /> <logger name="*" minlevel="Info" writeTo="file" /> <!--上报Exceptionless--> <logger name="*" minlevel="Info" writeTo="exceptionless" /> </rules> </nlog>
注册服务的时候,加载NLog.config配置
D:\Software\gitee\testexceptionless\Program.cs
//添加日志服务,读取NLog.config配置文件 private static void AddLogServicesFromFile(IServiceCollection services, IConfiguration configuration) { //NuGet下载NLog.Web.AspNetCore services.AddLogging(builder => { //移除已经注册的其他日志处理程序 builder.ClearProviders(); //只使用NLog记录日志 builder.AddNLogWeb();//获取NLog.config配置 }); }
通过NLog.config配置文件方式有一个缺点,无法满足一个项目部署到多个运行环境的需求,比如,测试环境,生产环境,需要配置不同的项目秘钥。当然也不是绝对不行,在部署阶段修改秘钥也可以,就是比较麻烦。
通过代码配置NLog记录器上传日志到Exceptionless
采用代码配置NLog记录器方式,可以在软件初始化阶段,读取外部配置文件或者环境变量,获取Exceptionless的项目秘钥,能够比较方便的满足多个运行环境的需求。
D:\Software\gitee\testexceptionless\Program.cs
//添加日志服务,通过代码配置记录器 private static void AddLogServicesByCode(IServiceCollection services, IConfiguration configuration) { //添加NLog和Exceptionless日志服务 var exceptionlessTarget = new ExceptionlessTarget(); exceptionlessTarget.ApiKey = "xxx"; exceptionlessTarget.ServerUrl = "https://www.mywed.cn:8811"; exceptionlessTarget.Name = "exceptionless"; exceptionlessTarget.Fields.Add(new ExceptionlessField() { Name = "CallSite", Layout = "${callsite}", }); //添加exceptionless的Target对象 LogManager.Configuration.AddTarget("exceptionless", exceptionlessTarget); //添加exceptionless的LoggingRule LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", global::NLog.LogLevel.Info, exceptionlessTarget)); //NuGet下载NLog.Web.AspNetCore services.AddLogging(builder => { //移除已经注册的其他日志处理程序 builder.ClearProviders(); //只使用NLog记录日志 builder.AddNLogWeb(LogManager.Configuration, null);//使用修改后的配置 }); }
测试提交日志
用Asp.Net Core默认的天气预报服务,记录日志,运行项目,显示天气预报页面,生成日志
D:\Software\gitee\testexceptionless\Data\WeatherForecastService.cs
public Task<WeatherForecast[]> GetForecastAsync(DateOnly startDate) { //_logger.LogDebug($"Debug获取了天气预报{startDate}"); _logger.LogInformation($"Info1获取了天气预报{startDate}"); _logger.LogWarning($"Warn获取了天气预报{startDate}"); //_logger.LogError(new Exception("测试错误"), $"获取了天气预报{startDate}"); //_logger.LogInformation($"Info2获取了天气预报{startDate}"); return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = startDate.AddDays(index), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }).ToArray()); }
在Exceptionless服务器选择项目,查看【全部日志】-【活动时间表】,可以看到上传的日志。
问题
我在测试的时候发现一个问题,如果没有warn类型,只有Info类型,有时候没有看到上传的日志。本机VS2022调试运行的时候发现日志上传不稳定,有时候没有及时上传。但是我把项目部署到云服务器,长期运行,日志还是比较稳定上传的。我不知道这是什么原因,但是因为项目在云服务器稳定运行后日志功能正常,所以就不去研究它了。
DEMO代码地址:https://gitee.com/woodsun/testexceptionless
标签:Exceptionless,Asp,startDate,config,Core,NLog,日志,exceptionlessTarget From: https://www.cnblogs.com/sunnytrudeau/p/17398238.html