一. 介绍

  在一上篇中介绍了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. csdn论坛页抓取

    抓取csdn论坛 实现功能 获取论坛分类所有链接,并拼接成推荐精华页的完成的链接 获取推荐精华页的帖子状态,赏分,帖子标题,作者,发布时间,回复量,查看量,最后发表时间 置顶内容不爬取,只打印置顶内容 ...

  2. python 12 生成器

    目录 1. 生成器 yeild 2. 推导式 2.1 列表推导式: 2.2 生成器推导式: 2.3 字典推导式: 2.4 集合推导式: 3. 内置函数(一) 1. 生成器 yeild 生成器的本质就是 ...

  3. Unity Editor已停止工作

    在更换系统之后,可能会出现打开刚安装好的Unity,显示Unity Editor已停止工作,这时候我们考虑是系统win7的问题.可以在原系统上升级,也可以重新安装,升级.文中所涉及到的软件,可在右侧加 ...

  4. office web apps server安装

    1.准备服务器 准备一台windows server 2012 R2服务器,修改计算机名称加入域,如果是通过虚拟机复制导致sid冲突,可以先运行 c:\windows\system32\sysprep ...

  5. J-Subarray_2019牛客暑期多校训练营(第二场)

    题意 有一个只由1,-1组成的数组,给出所有连续的1所在位置,求满足1的个数大于-1的个数的子区间的数量 题解 参考博客:https://www.cnblogs.com/Yinku/p/1122149 ...

  6. CodeForces - 697D - Puzzles DFS

    传送门:D - Puzzles 题意:在一个图中,从1开始dfs,求每一个点到达的期望: 思路:(下面是队长写的) 首先求的是到每一个点的步数的期望. 记fa( u ) = v, son( v )表示 ...

  7. codeforces 509 E. Pretty Song(前缀和+前缀和的前缀和)

    题目链接:http://codeforces.com/problemset/problem/509/E 题意:给你一个字符串,求字串中包括子串中I, E, A, O, U, Y.所占的概率和. 题解: ...

  8. react-router url参数更新 但是页面不更新的解决办法

    今天发现, 当使用react-router(v4.2.2)时,路由需要传入参数, 但是如果路由跳转时,url仅仅改变的是参数部分,如从hello/1跳转到hello/2,此时虽然参数更新了,但是页面是 ...

  9. hotcss.js Flexible 移动端适配在dpr=2和dpr=3出现的字体大小设置不正确问题.

    这段时间一直在用hotcss做移动端适配,做了几个页面没有发现什么问题,后来老大要加快进度,我把项目分出一块给另一个同事做,她发现了一个问题就是字体在dpr=2,dpr=3,的设备上字体大小显示老是不 ...

  10. Oracle 优化器_表连接

    概述 在写SQL的时候,有时候涉及到的不仅只有一个表,这个时候,就需要表连接了.Oracle优化器处理SQL语句时,根据SQL语句,确定表的连接顺序(谁是驱动表,谁是被驱动表及 哪个表先和哪个表做链接 ...