.Net Core项目中NLog整合Exceptionless实例

目录
  • 前言
  • 概念
    • Exceptionless
    • NLog
  • 环境搭建
    • Exceptionless搭建
    • 集成NLog
  • 简单测试一下
  • 总结

前言

在实际的.Net Core相关项目开发中,很多人都会把NLog作为日志框架的首选,主要是源于它的强大和它的扩展性。同时很多时候我们需要集中式的采集日志,这时候仅仅使用NLog是不够的,NLog主要是负责代码中日志的落地,也就是收集程序中的日志。类似的使用ELK(Elasticsearch+Logstash+Kibana)或EFK(Elasticsearch+Filebeat+Kibana)的集中式日志管理平台负责统一采集各个应用端通过日志框架手机的日志并统一的管理和展示。但是无论是ELK还是EFK,操作都有一定的复杂度,而且这是重型武器,有时候可能还不需要这么大的排场,这时候就需要一种轻量级的解决方案,而Exceptionless正式这种轻量级的分布式日志管理平台。

概念

可能有的同学对于Exceptionless或者是NLog还不是很了解,这里咱们就简单的介绍一下。

Exceptionless

简单的来说Exceptionless就是一款分布式日志管理框架,它可以统一收集管理并展示出来程序的日志,这样的话减少了传统开发过程中还需要去服务器查找日志的痛苦,大大提升对程序的运维效率。接下来我们先亮出来自学三件套

目前支持JavaScript, Node, .NET Core, .NET相关应用程序的异常信息采集。为何仅支持.Net .Net Core和JS相关的?原因很简单,Exceptionless是基于.NET Core开发的。如果你有别的语言的开发需求也想使用Exceptionless,这个时候不要气馁,因为Exceptionless本质是基于http接口的形式上报数据的,这个可在官方文档上找到如何使用http上报日志信息相关

以上文档有针对Exceptionless通过http接口对接的所有信息,通过它可以封装自己的sdk。

NLog

相信很多同学对NLog已经相当熟悉了,它是一款日志框架,完美的支持.Net和.Net Core,它在.Net Core的流行度和使用广泛度完全不亚于之前的Log4Net,最重要的它功能很强大,而且扩展起来非常方便,它支持将日志输入到多种target形式,比如txt文件、Sql Server、MySQL、Redis、Mq、MongoDb、ElasticSearch等,几乎能想到的所有存储相关的组件,而且还支持过时日志打包压缩自动删除等高级功能,也是我个人非常推荐的一款日志框架,而且它可以直接对接到.Net Core Logger组件上,废话不多说自学N件套地址

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程序为例

  • 完成之后,点击项目管理,这里的API秘钥正是我们上传到Exceptionless服务所需要的凭证

到了这一步Exceptionless搭建基本上就完成了。

集成NLog

新建一个名叫ProductApi的Asp.Net Core的项目,项目名称任意。然后添加Exceptionless.NLog包,这个包就是将NLog数据上报到Exceptionless的包

<PackageReference Include="Exceptionless.NLog" Version="4.6.2" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.10.0" />

Exceptionless.NLog的Github项目地址位于https://github.com/exceptionless/Exceptionless.Net/tree/master/src/Platforms/Exceptionless.NLog这个地址相当隐蔽不太容易被发现,而且说明文档也是很低调几乎没啥内容,可能是觉得NLog的文档写的太完善了,不用多说大家就能知道怎么用。添加完nuget包引用之后,修改Program.cs程序添加NLog的Logging扩展。仅仅添加UseNLog即可,因为我们使用了NLog.Web.AspNetCore扩展包,所以NLog会集成到Asp.Net Core自带的Microsoft.Extensions.Logging中去,不得不说.Net Core的整体扩展性还是非常强的,这样的话我们可以设置默认的Logging的配置即可,几乎感知不到NLog的存在

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).UseNLog();

接下来需要在项目根目录中新建nlog.config用来配置nlog相关信息,新建完成之后添加以下配置

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwExceptions="true" internalLogFile="internal-nlog.log" internalLogLevel="Debug" >
  <extensions>
    <!--添加扩展Exceptionless​程序集-->
    <add assembly="Exceptionless.NLog"/>
  </extensions>
  <targets async="true">
    <!--写入本地文件-->
    <target name="File" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log"
            layout=" ${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}| ${newline}" >
    </target>
    <!--上报Exceptionless-->
    <!--xsi:type:固定是Exceptionless-->
    <!--apiKey:即我们在Exceptionless中添加完项目后得到的apiKey-->
    <!--serverUrl:Exceptionless的地址-->
    <target xsi:type="Exceptionless" name="Exceptionless" apiKey="d66B6fXD6sz3kAuqdc5Fe04td7iIygunkDa5GoUt"
            serverUrl="http://10.255.52.93:5000/">
      <!--堆栈信息-->
      <field name="StackTrace" layout="${stacktrace}"/>
      <!--Message信息-->
      <field name="Message" layout="${message}"/>
      <field name="LogLevel" layout="${level}"/>
      <field name="CreateDate" layout="${date}"/>
      <!--物理名称-->
      <field name="MachineName" layout="${machinename}" />
      <!--线程ID-->
      <field name="ThreadId" layout="${threadid}"/>
      <!--发生源-->
      <field name="CallSite" layout="${callsite}"/>
      <field name="AppdomainVersion" layout="${assembly-version}"/>
      <field name="Appdomain" layout="${appdomain}"/> 
    </target>
  </targets>
  <rules>
    <!--本地文件-->
    <logger name="*" writeTo="File"/>
    <!--上报Exceptionless-->
    <logger name='*' writeTo='Exceptionless'/>
  </rules>
</nlog>

新建完nlog.config之后不要忘了将右击该文件 属性--->复制到输出路径--->始终复制,或修改该项目的csproj文件添加

<ItemGroup>
    <Content Update="nlog.config">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>

到这里为止关于NLog整合Exceptionless的环境搭建就已经完成了,是不是非常的简单,抛开环境搭建工作量其实并不大,这一切都是源于.Net Core的强大和它那灵活的可扩展性。

简单测试一下

通过上面的操作我们已经把NLog整合Exceptionless的环境搭建起来了,接下来我们随便写点代码测试一波随便建个类,就是为了演示异常,代码无任何实质意义,不喜勿喷。。。,这里我是模拟了一个ApiController抛出异常,然后用Logger记录了信息

[Route("productapi/[controller]")]
public class ProductController : ControllerBase
{
    private readonly ILogger _logger;
    public ProductController(ILogger<ProductController> logger)
    {
        _logger = logger;
    }

    [HttpGet("exceptiontest")]
    public string ExceptionTest()
    {
        try
        {
            throw new Exception("发生了未知的异常");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex,$"{HttpContext.Connection.RemoteIpAddress}调用了productapi/product/exceptiontest接口返回了失败");
        }
        return "调用失败";
    }
}

运行起来项目调用一下这段代码之后,查看Exceptionless,如果环境配置啥的都是正确的话,会展示出一下效果,点击All菜单展示出来的信息会比较全

可以点击查看详情,详情信息记录的非常详细,不得不说Exceptionless还是非常强大非常人性非常实用的

还能查看更详细的信息

到这里为止,关于NLog整合Exceptionless的操作就全部完成了,感叹一句就是不仅简单而且强大。

总结

通过本次整合NLog和Exceptionless,我们既感受到Exceptionless的简单和强大,也感受到了NLog的扩展性之强,希望更多地人能够尝试一下NLog。这一切还是得益于.Net Core自身的扩展性,特别是它内置的一些抽象,完全成为了构建.Net Core程序的核心,而且基于这些内置的核心抽象操作可以很轻松的扩展许多操作,使得模块之间的耦合性变得非常低,而这种设计的思想才是我们真正在编程中应该学习的。

到此这篇关于.Net Core项目中NLog整合Exceptionless实例的文章就介绍到这了,更多相关NLog整合Exceptionless内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Asp.Net Core用NLog记录日志操作方法

    需求 1.日志自动写入到数据库.写入到文件 2.appsettings.json数据库连接更改后,不需要去改NLog中的连接地址,启动网站或项目时自动检测变动然后去更改,以appsettings.json为准,保持同步. 3.写入日志时,除了NLog自带的字段,新增LogType自定义字段记录日志类型,例如网站日志.中间件日志等 4.统一的写日志方法,不用每次get一个logger对象(或依赖注入)来记日志 安装包 在nuget中安装NLog和NLog.Web.AspNetCore ,这两个是N

  • .Net项目中NLog的配置和使用实例详解

    引言: 因为之前在项目开发中一直都是使用的Log4Net作为项目的日志记录框架,最近忽然感觉对它已经有点腻了,所以尝试着使用了NLog作为新项目的日志记录框架(当然作为一名有志向的攻城狮永远都不能只局限于眼前的技术,要不断的使用和学习新的技术).当然serilog也是一个不错的日志记录框架哟,不过今天主要还是要讲述的是NLog在项目中的配置和使用. NLog框架源码:https://github.com/NLog/NLog 一.导入NLog NuGet PackAge: 二.配置NLog 配置文

  • ASP.NET Core与NLog集成的完整步骤

    前言 一直很喜欢 NLog 的简洁和扩展性,所以准备将 ASP.NET Core 提供的默认日志提供程序替换成 NLog. NLog 是一个跨平台的 .Net 日志组件. NLog 遵从 BSD license,即允许商业应用且完全开放源代码.任何人都可以免费使用并对其进行测试,然后通过邮件列表反馈问题以及建议. 下面话不多说了,来一起看看详细的介绍吧. 步骤 1 在项目的project.json中添加依赖NLog.Extensions.Logging: "dependencies":

  • ASP.NET Core开发教程之Logging利用NLog写日志文件

    前言 本文主要介绍了ASP.NET Core 开发-Logging 使用NLog 写日志文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 NLog 可以适用于 .NET Core 和 ASP.NET Core . ASP.NET Core已经内置了日志支持,可以轻松输出到控制台. 学习Logging 组件的相关使用,使用NLog 将日志写入到文件记录. Logging 使用 新建一个 ASP.NET Core 项目,为了方便,我选择Web 应用程序,改身份验证 改为

  • 详解.Net core2.0日志组件Log4net、Nlog简单性能测试

    .Net core之Log4net.Nlog简单性能测试 比较log4net.nlog的文件写入性能(.netcore环境),涉及代码和配置如有不正确的地方,还请批评指正. 测试环境 开发工具: Vsual Studio 2017 15.3 框架版本: .net core 2.0 操作系统:window10 Enterprise 1703 硬件配置:CPU I3-4170 3.7GHz,内存 8G,固态硬盘 日志组件 log4net 2.0.8 nlog 5.0.0-beta10 测试用例 1.

  • .Net Core项目中NLog整合Exceptionless实例

    目录 前言 概念 Exceptionless NLog 环境搭建 Exceptionless搭建 集成NLog 简单测试一下 总结 前言 在实际的.Net Core相关项目开发中,很多人都会把NLog作为日志框架的首选,主要是源于它的强大和它的扩展性.同时很多时候我们需要集中式的采集日志,这时候仅仅使用NLog是不够的,NLog主要是负责代码中日志的落地,也就是收集程序中的日志.类似的使用ELK(Elasticsearch+Logstash+Kibana)或EFK(Elasticsearch+F

  • asp.net core项目中如何使用html文件

    前言 大家应该都知道,在asp.net core 项目中,使用html文件一般通过使用中间件来提供服务: 打开 NuGet程序管理控制台 输入install-package Microsoft.aspnetcore.staticfiles 进行添加 ASP.NET Core static files middleware. Includes middleware for serving static files, directory browsing, and default files. 在S

  • .net core项目中常用的几款类库详解(值得收藏)

    前言 至2002微软公司推出.NET平台已近15年,在互联网快速迭代的浪潮中,许多语言已被淘汰,同时也有更多新的语言涌现,但 .Net 依然坚挺的站在系统开发平台的一线阵营中,并且随着.NET Core正式版的到来,迎来新一轮春天. 本文主要给大家介绍了关于.net core项目中常用的几款类库的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 汉字转拼音 1. HxfPinYin 这是我自己根据网上大神提供的源码,再.net core 框架下编译出的类库 主要提供汉字

  • vue项目中使用ueditor的实例讲解

    以vue-cli生成的项目为例 1.static文件夹下先放入ueditor文件 2.index.html添加如下代码 <script type="text/javascript" charset="utf-8" src="static/ueditor/ueditor.config.js"></script> <script type="text/javascript" charset="

  • ASP.NET Core项目中调用WebService的方法

    一.前言 现实生产中,有一些比较老的系统对外提供的接口都是WebService形式的,如果是使用.NET Framework创建的项目调用WebService非常方便,网上有很多代码示例,这里不在讲解,下面我们讲解如何在ASP.NET Core项目里面调用WebService.首先我们需要创建一个WebService项目和一个ASP.NET Core WebApi项目.创建的WebService代码如下: using System.Web.Services; namespace CoreCall

  • vue-cli项目中使用echarts图表实例

    我们在项目中经常需要使用一些折线图.柱状图.饼状图等等,之前使用过heightCharts,后来觉得这货不开源,只是做展示的话又点浪费时间,于是看了下eCharts,于是在vue-cli搭建的项目中添加了eCharts,下面是具体步骤和自己的一些学习笔记,参照于Echarts3官网 现在的前端一般需要完成将大量的数据,实现可视化.现在是大数据和云计算的时代,所以数据可视化逐渐变成一种趋势.而ECharts和d3.js则是可视化的成熟框架.对于制作的图表可以说是满足你的创造力. 两者相比,D3 它

  • 在Asp.net core项目中使用WebSocket

    今天小试了一下在Asp.net core中使用websocket,这里记录一下: 在 Startup 类的 Configure 方法中添加 WebSocket 中间件. app.UseWebSockets(); 它也可以传入一些参数 app.UseWebSockets(new WebSocketOptions() { KeepAliveInterval = TimeSpan.FromSeconds(120), ReceiveBufferSize = 4 * 1024 }); 添加WebSocke

  • 在IIS上部署ASP.NET Core项目的图文方法

    概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将HTTP响应数据重新回写到IIS中,最终转达到不同的客户端(浏览器,APP,客户端等).而配置文件和过程都会由些许调整,中间最重要的角色便是AspNetCoreModule,

  • ASP.net中Core自定义View查找位置的实例代码

    .NET Core 的内容处处可见,刷爆全球各大社区,所以,老周相信各位大伙伴已经看得不少了,故而,老周不考虑一个个知识点地去写,那样会成为年度最大的屁话,何况官方文档也很详尽.老周主要扯一下大伙伴们在入门的时候可能会疑惑的内容. ASP.NET Core 可以在一个项目中混合使用 Web Pages 和 MVC ,这是老周最希望的,因为这样会变得更灵活.Web Pages 类似于我们过去的 Web 开发方式,以页面为单位,此模型侧重于功能划分.而 MVC 侧重于数据,有什么样的数据模型就有什么

随机推荐