Exceptionless笔记
安装
简单试用了下Exceptionless本地部署并收集日志,在此记录下;
根据官方文档使用docker安装Exceptionless:安装文档
在浏览器中输入http://ip:5000进行访问如能出现如下页面就证明安装成功,此处需注册之后才能登陆。
获取异常日志
只需要在startup中加入Exceptionless中间件就可以使用Exceptionless捕获项目中的异常信息,并在Exceptionless中查看,代码如下:
Install-Package Exceptionless.AspNetCore -Version 4.6.2
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "OptionApi", Version = "v1" });
});
//添加Exceptionless,从配置中读取创建项目的apikey和ServerUrl
services.AddExceptionless(Configuration);
//添加HttpContextAccessor可以在异常日志中获取到请求信息
services.AddHttpContextAccessor();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "OptionApi v1"));
}
//使用
app.UseExceptionless();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
"Exceptionless": {
"ApiKey": "1K0H0Zy0CpKf45bJmHiZp2mWyLtO5CIGOGmH2cgA",
"ServerUrl": "http://192.168.74.5:5000"
}
- 自动捕获未处理的异常
在action中直接抛出异常,Exceptionless中就可以记录到没有处理的异常信息
[HttpGet("NoHandleException")]
public IActionResult NoHandleException()
{
throw new Exception("NoHandleException抛出一个没有处理的异常");
}
Tip: 日志详情中请求tab需要添加services.AddHttpContextAccessor(); 才会显示
- 手动提交已处理了的异常记录
[HttpGet("HandleException")]
public IActionResult HandleException()
{
try
{
throw new ApplicationException(Guid.NewGuid().ToString());
}
catch (Exception ex)
{
//SetProperty添加额外数据,AddTags添加标签
ex.ToExceptionless().SetProperty("userId",Guid.NewGuid()).AddTags("FirstTag").Submit();
}
return Ok("运行结束");
}
手动推送已处理的异常记录可以设置更多额外信息,记录更丰富;
推送其它日志信息到Exceptionless
Exceptionless不仅可以记录异常日志,也可以把其它类日志推送到Exceptionless,要推送其它日志需要安装Exceptionless.Extensions.Logging包
Install-Package Exceptionless.Extensions.Logging -Version 4.6.2
然后再Program.cs中配置
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((context, loggerBuilder) =>
{
var config = context.Configuration;
var apiKey = config.GetSection("Exceptionless:ApiKey").Value;
var serverUrl = config.GetSection("Exceptionless:ServerUrl").Value;
var client = new ExceptionlessClient(configure =>
{
//key
configure.ApiKey = apiKey;
configure.ServerUrl = serverUrl;
//默认记录日志等级
configure.SetDefaultMinLogLevel(LogLevel.Trace);
});
//添加Exceptionless
loggerBuilder.AddExceptionless(client);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
然后在类中正常记录日志就可以,例如:
private readonly ILogger<TestController> _logger;
public TestController(ILogger<TestController> logger)
{
_logger = logger;
}
[HttpGet("NoHandleException")]
public IActionResult NoHandleException()
{
_logger.LogDebug("NoHandleException这是一个debug日志");
_logger.LogInformation("NoHandleException这是一个information 日志");
_logger.LogWarning("NoHandleException这是一个Warning日志");
_logger.LogError("NoHandleException这是一个Error日志");
throw new Exception("NoHandleException抛出一个没有处理的异常");
}
Tip: 此处日志记录是基于asp.netcore内置日志服务,所以要获取debug日志,需要把appsettings.json中logging配置等级改为Trace或Debug
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Warning"
}
},
Serilog输出日志到Exceptionless
Exceptionless也支持其它第三方日志组件输出日志到Exceptionless,使用Serilog测试一下,安装包Serilog.Extensions.Hosting和Serilog.Sinks.ExceptionLess
Install-Package Serilog.Extensions.Hosting
Install-Package Serilog.Sinks.ExceptionLess
配置Serilog输出到Exceptionless
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((context, logBuilder) =>
{
var client = new ExceptionlessClient(c =>
{
c.ApiKey = "fBN6jdmUmSpKhmwa3F41h5db7CWvQAD3GVSsVCGm";
c.ServerUrl = "http://192.168.74.5:5000";
c.SetDefaultMinLogLevel(LogLevel.Trace);
});
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.MinimumLevel.Override("Microsoft",LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.WriteTo.Exceptionless(additionalOperation:b=>
{
b.AddTags("Serilog Example");
b.SetProperty("全局值", "全局内容");
return b;
},client:client)
.CreateLogger();
logBuilder.AddSerilog(dispose: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
在控制器中输出日志
[HttpGet("TestLog")]
public ActionResult TestLog()
{
_logger.LogDebug("debug");
_logger.LogInformation("information");
_logger.LogWarning("warning");
_logger.LogError("Error");
return Ok("结束");
}
在Exceptionless中可以看到有日志消息显示:
结语
简单的体验了一把Exceptionless收集日志并查看,其它高级功能和特性等需要使用时在研究研究。