一. 介绍

  在一上篇中介绍了Exceptionless的基本使用,这篇主要讲Exceptionless结合Nlog的实现双重日志记录,包括Exceptionles的UI可视化日志以及Nlog的txt文件日志。再是从Apollo配置中心读取配置文件,当系统越庞大越多时,需要配置的参数也越来越多,可以通过使用Apollo配置中心来统一管理,例如:配置数据库连接地址、Exceptionless的对应项目的apikey值,redis连接地址等等所有可配置的参数。

  1.1 asp.net core中Apollo配置

    打开asp.net core 项目,删除appsettings.json文件默认内容,在添加配置如下所示:

{
"apollo": {
"AppId": "100001",
"MetaServer": "http://192.168.0.100:8080/",
"Env": "Dev",
"Meta": {
"DEV": "http://192.168.0.100:8080/",
"FAT": "http://192.168.0.100:8080/",
"UAT": "http://192.168.0.100:8080/",
"PRO": "http://192.168.0.100:8080/"
}
}
}

    appsettings.json配置对应的Apollo客户端配置中心如下,这里端口8070是Apollo客户端配置界面。端口8080是.net core程序读取Apollo配置地址。Apollo配置中参数都是以key-value的形式存储。

    下面是读取Apollo配置文件的关键代码:

      安装包如下:

        Install-Package Microsoft.Extensions.Configuration -Version 2.2.
        Install-Package Com.Ctrip.Framework.Apollo.Configuration -Version 2.0.
      private static IConfigurationRoot _root = null;

        /// <summary>
/// 获取Apollo的config
/// </summary>
/// <returns></returns>
public static IConfigurationRoot GetRoot()
{
if (_root != null)
{
return _root;
} //先获取appsettings.json的配置
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build(); //连接Apollo
string appId = config.GetSection("apollo").GetSection("AppId").Value;
string metaServer = config.GetSection("apollo").GetSection("MetaServer").Value;
var configuration = new ConfigurationBuilder()
.AddApollo(appId, metaServer)
// .AddDefault(ConfigFileFormat.Xml)
// .AddDefault(ConfigFileFormat.Json)
// .AddDefault(ConfigFileFormat.Yml)
// .AddDefault(ConfigFileFormat.Yaml)
.AddDefault().AddNamespace("application")
.Build();
_root = configuration;
return _root;
}

    注意:如果变量configuration 中没有读取到Apollo参数值,可以从configuration 对象的参数中查找返回的异常信息。如果读取成功会缓存一份文件到本地,如下所示:

      //下面是从Apollo(AppId:100001)的配置中心获取Key为“ApiKey”的value值:
  string apiKey = GetRoot().GetSection("ApiKey").Value; 

    关于Apollo更多资料,包括Apollo服务端部署,参考官方文档:https://github.com/ctripcorp/apollo

  1.2 Nlog结合Exceptionles

    安装包如下:

     Install-Package Exceptionless.NLog
  Install-Package NLog.Web.AspNetCore

    在Nlog的基础上,结合Exceptionles,关键代码如下

      (也可尝试通过配置文件实现 https://github.com/exceptionless/Exceptionless.Net/tree/master/src/Platforms/Exceptionless.NLog):

     /// <summary>
/// 返回Nlog.Logger
/// </summary>
/// <returns></returns>
public Logger GetExceptionlessLogger()
{
var config = new LoggingConfiguration();
var exceptionlessTarget = new ExceptionlessTarget(); //读取Apploo的Exceptionless配置参数
string apiKey = ConfigHelper.GetRoot().GetSection("ApiKey").Value;
string serverUrl = ConfigHelper.GetRoot().GetSection("ServerUrl")?.Value;
exceptionlessTarget.ApiKey = apiKey;
exceptionlessTarget.ServerUrl = serverUrl; exceptionlessTarget.Layout = "${longdate} | ${callsite} | ${level} | ${message}";
exceptionlessTarget.Name = "exceptionless";
//添加exceptionless的Target对象
config.AddTarget("exceptionless", exceptionlessTarget);
config.LoggingRules.Add(new LoggingRule("*", global::NLog.LogLevel.Error, exceptionlessTarget));
LogManager.Configuration = config;
return LogManager.GetCurrentClassLogger();
     } /// <summary>
/// Nlog.Logger对象
/// </summary>
private Logger _logger
{
get
{
return N.NLogBuilder.ConfigureNLog("Config\\NLog.config").GetCurrentClassLogger();
}
} /// <summary>
/// 带有Exceptionless的Nlog.Logger对象
/// </summary>
private Logger _exceptionlessLogger
{
get
{
ExceptionlessHelper helper = new ExceptionlessHelper();
return helper.GetExceptionlessLogger();
}
}
     //记录错误日志
public void Error<T>(IFormatProvider formatProvider, T value)
{
_logger.Error(formatProvider, value);
_exceptionlessLogger.Error(formatProvider, value);
}

二. Nlog结合Exceptionles代码优化

  在1.2中介绍了二种日志的结合,下面把1.2的代码进行优化改造,主要包括:

    (1) 去掉nlog的配置文件,使用编码来处理

    (2) 记录日志时,只需要一个_logger.Error,就能同时记录到txt文件和exceptionless中。

        /// <summary>
/// Nlog.Logger对象
/// </summary>
private Logger _logger
{
get
{
var config = new LoggingConfiguration();// N.NLogBuilder.ConfigureNLog("Config\\NLog.config");
//添加exceptionless日志文件
var exceptionlessTarget = GetExceptionlessTarget();
config.AddTarget("exceptionless", exceptionlessTarget);
config.AddRule(LogLevel.Debug, LogLevel.Fatal, exceptionlessTarget); //添加txt日志文件
var logfile = new FileTarget("logfile") { FileName =string.Format(@"c:\temp\{0}.log",DateTime.Now.ToString("yyyy-MM-dd")) };
logfile.Layout = "${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}";
config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile); LogManager.Configuration = config;
return LogManager.GetCurrentClassLogger();
}
} /// <summary>
/// 返回Nlog Target
/// </summary>
/// <returns></returns>
public static ExceptionlessTarget GetExceptionlessTarget()
{
var exceptionlessTarget = new ExceptionlessTarget();
//读取Apploo配置的Exceptionless地址
string apiKey = ConfigHelper.GetRoot().GetSection("ApiKey").Value;
string serverUrl = ConfigHelper.GetRoot().GetSection("ServerUrl")?.Value;
exceptionlessTarget.ApiKey = apiKey;
exceptionlessTarget.ServerUrl = serverUrl;
exceptionlessTarget.Layout = "${longdate} | ${callsite} | ${level} | ${message}";
exceptionlessTarget.Name = "exceptionless";
return exceptionlessTarget;
} //记录日志
public void Error(string message, Exception exception)
{
_logger.Error(exception, message);
}

  效果如下所示:

    

asp.net core系列 73 Exceptionless+Nlog以及Apollo介绍的更多相关文章

  1. asp.net core系列 72 Exceptionless使用介绍

    一.Exceptionless介绍 Exceptionless专注于.net平台提供实时错误和日志报告.主要包括:错误通知.智能分组异常.详细错误报告堆栈跟踪.支持离线.UI查看重要错误和确定优先级. ...

  2. asp.net core系列 74 Exceptionless服务端安装

    一.   Docker安装 Docker   要求版本Docker 18.09.0+以上 安装地址:https://www.runoob.com/docker/windows-docker-insta ...

  3. asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用

    前言:由于公司占时没有运维,出于微服务的需要,Apollo只能先装在windows 阿里云上跑起来,由于环境及网络等问题,在安装过程中遇到很多坑,算是一个个坑填完后,最终实现. 一. java jdk ...

  4. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...

  5. EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真

    EF Core使用SQL调用返回其他类型的查询   假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...

  6. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  7. Asp.net Core 系列之--4.事务、日志及错误处理

    ChuanGoing 2019-11-17 这篇原本时想把事务处理.日志处理.错误处理.授权于鉴权一并介绍完的,授权和鉴权我想结合自定义权限来介绍,全部放到这里篇幅可能太长,因此权限部分将会在下篇来介 ...

  8. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  9. [转]ASP.NET Core 开发-Logging 使用NLog 写日志文件

    本文转自:http://www.cnblogs.com/Leo_wl/p/5561812.html ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 . ...

随机推荐

  1. .Net 连接FTP下载文件报错:System.InvalidOperationException: The requested FTP command is not supported when using HTTP proxy

    系统环境: Windows + .Net Framework 4.0   问题描述: C#连接FTP下载文件时,在部分电脑上有异常报错,在一部分电脑上是正常的:异常报错的信息:System.Inval ...

  2. shell习题2

    1---------------->>>>输入一个设备文件,输出这个设备文件的基本信息: 2.------------->>>>显示一个如下的菜单,cp ...

  3. 90002CAD相关操作

    第一章   初识CAD 1.1 CAD能干什么 (1)绘制机械图/建筑图/装修图等二维复杂工程图的不二之选.二维设计软件的王者. (2)CAD可以绘制平面图.轴测图(二维线框表示三维图形).立体图(三 ...

  4. Python 基础1 - 位运算符

    引言 本文主要介绍位运算符,实际上Python有以下7类运算符: [赋值运算符].[比较运算符].[算术运算符].[逻辑运算符].[身份运算符].[成员运算符].[位运算符] 位运算符 按位运算符是把 ...

  5. egret之每日登陆奖励

    //*******首登奖励********* */ //*********************** */ public setUserSetting(key, value) { if (value ...

  6. CocosCreator上的游戏(调试)发布到微信小程序

    1.下载CocosCreator,微信开发者工具 官网地址:http://www.cocos.com/download 官网下载:https://developers.weixin.qq.com/mi ...

  7. 导航页的开发--手机web app开发笔记

    好了,的所有的基础知识已经准备完毕了,现在开始制作引导页.这个引导页需要一个HTML文件,JS文件,一个CSS文件.在HBuilderX中根目录下添加“Guid.html”,在JS文件夹添加“myth ...

  8. 使用Springboot Cache做简单缓存

    使用Springboot Cache做简单缓存 1.简单介绍 ​ 当我们需要展示数据的时候,后台会根据需要从服务器中获取数据,但是频繁的请求数据库会对服务造成压力,于是我们引入了缓存这个概念. ​ 当 ...

  9. Minimum spanning tree for each edge(倍增LCA)

    https://vjudge.net/contest/320992#problem/J 暑期训练的题. 题意:给你一个n个点,m条边的无向图.对于每一条边,求包括该边的最小生成树. 思路:首先想到求一 ...

  10. Atcoder F - Mirrored(思维+搜索)

    题目链接:http://arc075.contest.atcoder.jp/tasks/arc075_d 题意:求rev(N)=N+D的个数,rev表示取反.例如rev(123)=321 题解:具体看 ...