• .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

  • 相关阅读:
    C标准库函数实现
    每天一句话
    移植数码相框到arm开发板上
    数据管理
    perl 分割文件路径和文件名
    恶补英语 拿 The C programming language 练功
    英语学习 chapter1
    uboot 烧写过程
    MVC,去掉字符串中的html代码
    排序之希尔排序
  • 原文地址:https://www.cnblogs.com/MicroHeart/p/13621978.html
Copyright © 2020-2023  润新知