Exceptionless可以为ASP.NET、Web API、WebForms、WPF、控制台和MVC应用程序提供实时错误,功能和日志报告。
它将收集的信息组织成简单的可操作数据,这将有助于应用程序变得无异常。最重要的是,它是开源的!
关于Serilog的用法可以参考文章:
将Serilog和Exceptionless相融合,实现两个功能:
1.将日志记录到文本中(Serilog的功能)
2.将日志记录到Exceptionless中(本文章只将数据记录到Exceptionless官方的日志服务器,也可以记录到自己部署的Exceptionless服务器,我只是为了看效果,没有自己搭建日志服务器。)
基于.Net Core WebApi 3.1程序,项目结构如下图:
1.到exceptionless的官网创建一个自己的项目,创建完成后,会分发一个key,拿到key以后在项目中使用。
登录进去后创建一个新的项目
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的部署等相关信息可以参考: