一、日志组件介绍
在之前单体项目的时候,经常使用的日志组件有NLog、Log4,还有.Net Core自带的日志组件Logging(之前写过),使用它们记录到文本文件中,但是当日志文件很大的时候,查询日志就变的很痛苦。Exceptionless是一个开源的日志组件,它将消息存储到ElasticSearch中,查询速度自然不用说。并且提供了管理界面,方便日志的查询,并且客户端的配置也很简单。
二、服务端安装
项目地址:https://github.com/exceptionless/Exceptionless
版本4.1以下都是Framework版本,版本5以上是Core版本。Framework部署到Window上比较麻烦,Core版本直接通过Docker部署比较方便,我部署的是5.0版本。
首先下载代码,修改 docker-compse.yml文件
1、修改IP地址,改为本地地址
2、需改镜像 exceptionless/elasticsearch:1 为 edisonsaonian/exceptionless-elasticsearch:1
3、运行命令 docker-compose up -d
会下载运行五个容器,打开地址 http:Ip:5100 就可以进入UI界面。
三、客户端使用
UI界面如下,日志记录分为异常(Exception)和日志(Log)两种,对应客户端使用 也是两种不同的提交方式。
首先创建组织和项目,然后选择对应的项目类型。比如选择的是Asp.Net Core项目,在项目中引入Exceptionless.AspNetCore包,只需要在Configure方法中加上app.UseExceptionless(Configuration),然后在配置文件中加上先配置。
"Exceptionless": { "ServerUrl": "http://IP:5000/", "ApiKey": "你的key" }
在需要提交异常的地方:
ExceptionlessClient.Default.CreateException(ex).Submit();
在需要提交日志的地方:
ExceptionlessClient.Default.CreateLog(ex).Submit();
然后就可以在Exceptionless后台界面中看到异常和日志。
在分布式系统中,一次请求会请求过个服务,这时候在多个服务中查找请求日志就比较麻烦,我们可以在请求中加上EventId,查找EventId就找到所有日志。
四、封装一个Excelessless组件
每次提交日志和异常,都这么写就很长,所以我们继承.Net Core 的ILogger,写个ExceptionlessLogger
public class ExceptionlessLogger : ILogger { private readonly string _categoryName; public ExceptionlessLogger(string categoryName) { _categoryName = categoryName; } public IDisposable BeginScope<TState>(TState state) { return NoopDisposable.Instance; } public bool IsEnabled(LogLevel logLevel) { return true; } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { var message = formatter(state, exception); var source = $"{_categoryName}"; EventBuilder eventBuilder = null; if (exception != null) eventBuilder = ExceptionlessClient.Default.CreateException(exception); else eventBuilder = ExceptionlessClient.Default.CreateLog(source, message, logLevel.ToString()); eventBuilder.SetMessage(message).SetSource(source); if (eventId != 0) eventBuilder.SetProperty("enentId", eventId); eventBuilder.Submit(); } private class NoopDisposable : IDisposable { public static NoopDisposable Instance = new NoopDisposable(); public void Dispose() { } } }
在写个拓展方法,将我们写的注入到容器中
public static class ExceptionlessExtension { public static void UseExceptionlessLogging(this IApplicationBuilder app) { var provider = app.ApplicationServices; var configuration = provider.GetService<IConfiguration>(); var loggerFactory = provider.GetService<ILoggerFactory>(); app.UseExceptionless(configuration); var client = ExceptionlessClient.Default; client.Configuration.UseInMemoryStorage(); loggerFactory.AddProvider(new ExlessLoggerProvider()); } }
使用的时候,只需要加上一行代码,如下:
在Controller中只需要注入ILogger 就可以了。
管理界面就有了我们的日志信息。