開源日誌組件Exceptionless

一、日誌組件介紹

  在之前單體項目的時候,經常使用的日誌組件有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 就可以了。

 管理界面就有了我們的日誌信息。

 源代碼:https://github.com/MicroHeartWangZheng/Logging

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章