您现在的位置是:网站首页> 编程资料编程资料
.Net Core项目中NLog整合Exceptionless实例_实用技巧_
2023-05-24
315人已围观
简介 .Net Core项目中NLog整合Exceptionless实例_实用技巧_
前言
在实际的.Net Core相关项目开发中,很多人都会把NLog作为日志框架的首选,主要是源于它的强大和它的扩展性。同时很多时候我们需要集中式的采集日志,这时候仅仅使用NLog是不够的,NLog主要是负责代码中日志的落地,也就是收集程序中的日志。类似的使用ELK(Elasticsearch+Logstash+Kibana)或EFK(Elasticsearch+Filebeat+Kibana)的集中式日志管理平台负责统一采集各个应用端通过日志框架手机的日志并统一的管理和展示。但是无论是ELK还是EFK,操作都有一定的复杂度,而且这是重型武器,有时候可能还不需要这么大的排场,这时候就需要一种轻量级的解决方案,而Exceptionless正式这种轻量级的分布式日志管理平台。
概念
可能有的同学对于Exceptionless或者是NLog还不是很了解,这里咱们就简单的介绍一下。
Exceptionless
简单的来说Exceptionless就是一款分布式日志管理框架,它可以统一收集管理并展示出来程序的日志,这样的话减少了传统开发过程中还需要去服务器查找日志的痛苦,大大提升对程序的运维效率。接下来我们先亮出来自学三件套
- 官网地址:https://exceptionless.com/
- 官方文档地址:https://exceptionless.com/docs/
- 官方Github地址:https://github.com/exceptionless/Exceptionless
目前支持JavaScript, Node, .NET Core, .NET相关应用程序的异常信息采集。为何仅支持.Net .Net Core和JS相关的?原因很简单,Exceptionless是基于.NET Core开发的。如果你有别的语言的开发需求也想使用Exceptionless,这个时候不要气馁,因为Exceptionless本质是基于http接口的形式上报数据的,这个可在官方文档上找到如何使用http上报日志信息相关
- 官方文档api地址:https://exceptionless.com/docs/api/api-getting-started/
- api官方文档地址:https://api.exceptionless.io/
- api官方swagger地址:https://api.exceptionless.io/docs/index.html
以上文档有针对Exceptionless通过http接口对接的所有信息,通过它可以封装自己的sdk。
NLog
相信很多同学对NLog已经相当熟悉了,它是一款日志框架,完美的支持.Net和.Net Core,它在.Net Core的流行度和使用广泛度完全不亚于之前的Log4Net,最重要的它功能很强大,而且扩展起来非常方便,它支持将日志输入到多种target形式,比如txt文件、Sql Server、MySQL、Redis、Mq、MongoDb、ElasticSearch等,几乎能想到的所有存储相关的组件,而且还支持过时日志打包压缩自动删除等高级功能,也是我个人非常推荐的一款日志框架,而且它可以直接对接到.Net Core Logger组件上,废话不多说自学N件套地址
- 官方GitHub地址:https://github.com/NLog/NLog
- 官方文档地址:https://nlog-project.org/
- 文档地址:https://github.com/NLog/NLog/wiki
- 配置相关地址:https://nlog-project.org/config/
NLog最大的优势就是强大,强大到你能用到的它几乎都支持,而且你想不到的它可能也支持了,而且使用起来也是非常的简单。作为日志框架,我觉得它是最值得一试的一款。
环境搭建
上面我们已经分别介绍了Exceptionless和NLog知道了他们的概念。Exceptionless支持直接采集日志信息上报到Exceptionless,也就是原始的方式,这个官方文档上都有相关的介绍,这里咱们就不过多介绍这种方式了,使用原始方式的的时候可能会存在许多的问题,比如上报形式单一采集格式的问题等。许多时候我们是使用日志框架记录程序日志相关的,它的优势在于target丰富,而且支持自定义日志格式等等,恰恰NLog足够强大,支持直接将Log数据上报到Exceptionless,接下来我们就来看一下它们之间的整合方式。
Exceptionless搭建
官网提供了两种使用的方式
- 一种是在官方网站注册账号然后获取apiKey,这样的话不用自己搭建Exceptionless,而是将日志直接收集上报到Exceptionless服务器上。但是,一般基于安全和性能考虑,这种方式并不常用。
- 另一种则是自建Exceptionless服务,也是本篇我们要使用的方式。之前的低版本支持在window服务器上自建服务,但是高版本已经是基于docker的方式构建了。而使用docker的方式也是我个人日常学习中比较喜欢的方式。
官方也是提供了两种方式去基于docker构建Exceptionless,一种是基于源码自行构建,另一种则是通过官方docker镜像直接运行容器。因为Exceptionless依赖Elasticsearch存储所以官方也是也是直接提供了docker-compose的方式去运行容器。
如果使用基于源码的方式构建,首先是找到Exceptionless的官方GitHub地址https://github.com/exceptionless/Exceptionless去clone源代码,或者直接下载源码的Release包https://github.com/exceptionless/Exceptionless/releases。下载完成之后进入项目根目录找到docker-compose.dev.yml文件,文件内容如下
version: '3.7' services: #通过源码自行构建镜像 app: #依赖elasticsearch和redis depends_on: - elasticsearch - redis build: context: . target: app image: exceptionless/app:latest environment: EX_AppMode: Production EX_ConnectionStrings__Cache: provider=redis EX_ConnectionStrings__Elasticsearch: server=http://elasticsearch:9200 #redis的作用是消息总线、消息队列和缓存 EX_ConnectionStrings__MessageBus: provider=redis EX_ConnectionStrings__Queue: provider=redis EX_ConnectionStrings__Redis: server=redis,abortConnect=false EX_RunJobsInProcess: 'false' #暴露访问端口 ports: - 5000:80 - 5001:443 volumes: - appdata:/app/storage - ssldata:/https jobs: depends_on: - app image: exceptionless/job:latest build: context: . target: job environment: EX_AppMode: Production EX_BaseURL: http://localhost:5000 EX_ConnectionStrings__Cache: provider=redis EX_ConnectionStrings__Elasticsearch: server=http://elasticsearch:9200 EX_ConnectionStrings__MessageBus: provider=redis EX_ConnectionStrings__Queue: provider=redis EX_ConnectionStrings__Redis: server=redis,abortConnect=false EX_ConnectionStrings__Storage: provider=folder;path=/app/storage volumes: - appdata:/app/storage elasticsearch: image: exceptionless/elasticsearch:7.10.0 environment: discovery.type: single-node xpack.security.enabled: 'false' ES_JAVA_OPTS: -Xms1g -Xmx1g ports: - 9200:9200 - 9300:9300 volumes: - esdata7:/usr/share/elasticsearch/data kibana: depends_on: - elasticsearch image: docker.elastic.co/kibana/kibana:7.10.0 ports: - 5601:5601 redis: image: redis:6.0-alpine ports: - 6379:6379 volumes: esdata7: driver: local appdata: driver: local ssldata: driver: local
通过上面的docker-compose文件我们可以看出目前Exceptionless依赖elasticsearch和redis,大致可以看出Exceptionless存储是依赖elasticsearch,而提升性能的则是redis,比如消息总线防止并发的缓冲队列都是依赖redis的,具体实现细节我们这里就不做过多套路了。因为使用dev的方式构建镜像的方式依赖Exceptionless源码,所以不建议移动该docker-compose文件位置,使用docker-compose的指令直接运行该文件
docker-compose -f docker-compose.dev.yml up
上面的方式虽然可以直接依靠源码去构建,但是其实大可不必这么复杂比如kibana这种完全就是多余的,而且他的这种方式是依赖源码的,生产环境我们不可能把代码直接copy过去,所以我们需要精简一下,如下所示
version: '3.7' services: app: depends_on: - elasticsearch - redis image: exceptionless/exceptionless:latest environment: EX_AppMode: Production EX_ConnectionStrings__Cache: provider=redis EX_ConnectionStrings__Elasticsearch: server=http://elasticsearch:9200 EX_ConnectionStrings__MessageBus: provider=redis EX_ConnectionStrings__Queue: provider=redis EX_ConnectionStrings__Redis: server=redis:6379,abortConnect=false EX_RunJobsInProcess: 'false' ports: - 5000:80 volumes: - appdata:/app/storage jobs: depends_on: - app image: exceptionless/job:latest environment: EX_AppMode: Production EX_BaseURL: http://localhost:5000 EX_ConnectionStrings__Cache: provider=redis EX_ConnectionStrings__Elasticsearch: server=http://elasticsearch:9200 EX_ConnectionStrings__MessageBus: provider=redis EX_ConnectionStrings__Queue: provider=redis EX_ConnectionStrings__Redis: server=redis:6379,abortConnect=false EX_ConnectionStrings__Storage: provider=folder;path=/app/storage volumes: - appdata:/app/storage elasticsearch: image: exceptionless/elasticsearch:7.10.0 environment: discovery.type: single-node xpack.security.enabled: 'false' xpack.ml.enabled: 'false' ES_JAVA_OPTS: -Xms1g -Xmx1g ports: - 9200:9200 - 9300:9300 volumes: - esdata7:/usr/share/elasticsearch/data redis: image: redis:6.0-alpine ports: - 6379:6379 volumes: esdata7: driver: local appdata: driver: local
将上面的yml内容直接复制到一个新建的docker-compose.yml的空文件中就可以直运行了,无任何额外的依赖,在yml文件所在路径直接运行以下命令
docker-compose up -d
如果你的服务器已经拥有了elasticsearch和redis服务,也就是不需要使用以上docker-compose的方式进行构建,那么可以直接使用官方docker镜像的方式直接启动Exceptionless容器,可以使用docker原生的方式直接运行
sudo docker run -d -e EX_AppMode=Production -e EX_ConnectionStrings__Cache="provider=redis" -e EX_ConnectionStrings__Elasticsearch="server=http://10.255.198.168:9200" -e EX_ConnectionStrings__MessageBus="provider=redis" -e EX_ConnectionStrings__Queue="provider=redis" -e EX_ConnectionStrings__Redis="server=10.255.198.168:6379,abortConnect=false" -e EX_RunJobsInProcess=false -e EX_Html5Mode=true -p 5000:80 exceptionless/exceptionless:latest
这里注意修改下相关服务的ip地址,因为我粘贴的是我本机的地址,而且注意elasticsearch的版本必须是7.x版本的,否则的话会报错。程序启动完成后再浏览器输输入http://ip:5000后会自动跳转到登录界面

如果没有登录账户需要注册一个新的用户后,登录到首页如图所示

因为Exceptionless每个项目的日志信息是根据apiKey去区分的,所以要在Exceptionless中添加你需要采集日志的项目,具体操作如以下步骤
- 首先,点击所有项目--->创建项目

- 然后,输入组织名称和项目名称

- 然后,选择项目类型,这里以Asp.Net Core程序为例
提示:
本文由神整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
相关内容
- .NET Core对象池的应用:扩展篇_实用技巧_
- .NET Core对象池的应用:设计篇_实用技巧_
- .NET Core对象池的应用:编程篇_实用技巧_
- NAT网络地址转换详情_ASP.NET_
- .Net Framework .Net .NET Standard的概念及区别_ASP.NET_
- C# 有关Assembly.Unload详解_实用技巧_
- ASP.NET session.timeout设置案例详解_实用技巧_
- .net core api接口JWT方式认证Token_实用技巧_
- 解决ASP.NET Core中使用漏桶算法限流的问题_实用技巧_
- Quartz在.NET中的使用教程_实用技巧_
