.Net Core 开源日志组件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

posted @ 2020-09-14 19:03  MicroHeart!  阅读(997)  评论(0编辑  收藏  举报