安装
简单试用了下Exceptionless本地部署并收集日志,在此记录下;
根据官方文档使用docker安装Exceptionless:安装文档
在浏览器中输入http://ip:5000进行访问如能出现如下页面就证明安装成功,此处需注册之后才能登陆。
1、到github下载Exceptionless .net core版本,5.0.0及以后版本都是.net core版本,我下载的是6.0.0(windows系统)
2.下载下来解压,生成 (运行 dotnet restore,dotnet build)
3.在解压后的源码文件夹打开终端,运行 docker-compose up -d
4.有外网的环境下直接运行docker命令:docker run -d --rm -it -p 5000:80 exceptionless/exceptionless:latest 即可(前提是有安装elasticsearch和redis)
获取异常日志
只需要在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
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收集日志并查看,其它高级功能和特性等需要使用时在研究研究。