一、日誌組件介紹
在之前單體項目的時候,經常使用的日誌組件有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 就可以了。
管理界面就有了我們的日誌信息。