.Net 日志系统-Serilog+Exceptionless

Exceptionless可以为ASP.NET、Web API、WebForms、WPF、控制台和MVC应用程序提供实时错误,功能和日志报告。

它将收集的信息组织成简单的可操作数据,这将有助于应用程序变得无异常。最重要的是,它是开源的!

关于Serilog的用法可以参考文章:

.Net 日志系统-Serilog

将Serilog和Exceptionless相融合,实现两个功能:

1.将日志记录到文本中(Serilog的功能)

2.将日志记录到Exceptionless中(本文章只将数据记录到Exceptionless官方的日志服务器,也可以记录到自己部署的Exceptionless服务器,我只是为了看效果,没有自己搭建日志服务器。)

基于.Net Core WebApi 3.1程序,项目结构如下图:

1.到exceptionless的官网创建一个自己的项目,创建完成后,会分发一个key,拿到key以后在项目中使用。

https://exceptionless.com/

 登录进去后创建一个新的项目

 

 

2.第一步操作已经获取到了key,接着在项目中安装需要的包

Serilog.AspNetCore

Serilog.Sinks.Exceptionless

3.在Startup.cs文件中添加Exceptionless的相关配置

 需要添加的代码如下:

ExceptionlessClient.Default.Startup("0ydfmIL6RvK58ZnKPBUF");//这里的key是Exceptionless分发的

//Exceptionless的默认警告级别是warn,如果需要可以调整级别
ExceptionlessClient.Default.Configuration.SetDefaultMinLogLevel(LogLevel.Info);

这里没有使用官网推荐的services.AddExceptionless("xxxxxxxxxxxxx") 的方法,是因为我发现这个方法没法设置默认警告级别,只能记录warn及更高级别的日志。所以换成了ExceptionlessClient.Default的写法。

4.在Program.cs文件中配置Serilog相关的属性

 Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.Text;

namespace SerilogProject
{
    public class Program
    {
        public static void Main(string[] args)
        {

            // 创建全局静态实例
            Log.Logger = new LoggerConfiguration()
            //设置最小日志级别
            .MinimumLevel.Debug()
            //将日志写到文件
            .WriteTo.File($"logs/{DateTime.Now:yyyy-MM-dd}/log.txt", //日志按照天为单位创建文件夹
                outputTemplate: @"{Timestamp:yyyy-MM-dd HH:mm-ss.fff }[{Level:u3}] {Message:lj}{NewLine}{Exception}",  // 设置输出格式,显示详细异常信息
                rollingInterval: RollingInterval.Day, //日志按天保存
                rollOnFileSizeLimit: true,            // 限制单个文件的最大长度
                fileSizeLimitBytes: 10 * 1024,        // 单个文件最大长度10K
                encoding: Encoding.UTF8,              // 文件字符编码
                retainedFileCountLimit: 10            // 最大保存文件数,超过最大文件数会自动覆盖原有文件
            )
            //将日志写到Exceptionless中
            .WriteTo.Exceptionless()
            .CreateLogger();


            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).UseSerilog();
    }
}

5.在控制器的Action中调用日志记录的方法,将日志同时写入到文本和Exceptionless中

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;

namespace SerilogProject.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public void Get()
        {
            //_logger.LogDebug("我是Debug信息");
            _logger.LogInformation("我是info信息");
            _logger.LogWarning("我是Warning信息");
            _logger.LogError("我是error信息");
            _logger.LogCritical("我是Critical信息");


            var person = new Person { Name = "aa", FirstName = "bb", Id = 5 };
            _logger.LogInformation("Person类信息: {@Person}", person);

            _logger.LogInformation("The time is {Now}", DateTime.Now);

            try
            {
                _logger.LogDebug("抛出异常");
                throw new InvalidProgramException("程序错误。");
            }
            catch (Exception e)
            {
                _logger.LogError(e, "捕获异常");
            }

        }
    }



}

程序执行结果:

文本文件中记录的日志信息

exceptionless记录的日志信息

 

到此为止,日志记录到了文本中,同时也记录到了exceptionless中。

整个的逻辑流程如下:

当然也可以不通过Serilog直接将日志写入exceptionless中,通过Serilog的好处是可以记录结构化日志,将日志记录到文本或数据库等媒介中。

关于Exceptionless的部署等相关信息可以参考:

Exceptionless(一)- .Net Core开源日志框架-Exceptionless

Exceptionless(二) - 使用进阶-Exceptionless

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值