Asp.Net Core使用Exceptionless日志服务2-集成Exceptionless.NLog

Asp.Net Core使用Exceptionless日志服务2-集成Exceptionless.NLog

 

Exceptionless有自己一套完整的Api用于提交日志,我的项目已经写好了,使用Asp.Net Core标准接口ILogger记录日志,然后通过NLog输出到文件和控制台,我不想修改标准的日志接口,幸好有Exceptionless.NLog这样强大的组件,可以直接把NLog日志配置输出到Exceptionless服务。

NuGet安装NLog.Web.AspNetCoreExceptionless.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记录器,填写项目的秘钥apiKeyExceptionless服务器地址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

 

posted on 2023-05-13 21:23  SunnyTrudeau  阅读(126)  评论(0编辑  收藏  举报