一. 介绍

  在一上篇中介绍了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. Web Worker 使用教程

    一.概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事.前面的任务没做完,后面的任务只能等着.随着电脑计算能力的增强,尤其是多核 CPU 的出 ...

  2. jmeter+ant生成xml报告

    1.jdk安装 2.jmter安装 3.ant安装 下载apache-ant-1.10.6-bin.zip,直接解压就可使用,和jmeter类似 ant环境变量配置 新建系统变量:ANT_HOME,变 ...

  3. linux安装man中文手册并保留英文man手册

    大家都知道学习linux系统,查找man手册帮助是非常重要的,然而默认linux的man手册是英文文档,快速阅读英文man固然重要,不过配置好中文man也可以让自己更快速地学习!当然英文学习大家还是不 ...

  4. 09_if条件语句的使用

    1.条件语句是用来判断给定的条件是否满足(表达式值是否为0),并根据判断的结果(真或假)决定执行的语句2.go语言和C语言的条件语句在语法格式上大体相似,但是还是有略微的不同,具体的细节如下 例子:p ...

  5. Elasticsearch核心技术(2)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)

    Elasticsearch核心技术(2)--- 基本概念 这篇博客讲到基本概念包括: Index.Type.Document.集群,节点,分片及副本,倒排索引. 一.Index.Type.Docume ...

  6. netcore 中的动态代理与RPC实现(微服务专题)

    一.关于RPC的调用 1. 调用者(客户端Client)以本地调用的方式发起调用: 2. Client stub(客户端存根)收到调用后,负责将被调用的方法名.参数等打包编码成特定格式的能进行网络传输 ...

  7. JVM中class文件探索与解析

    一直想成为一名优秀的架构师的我,转眼已经工作快两年了,对于java内核了解甚少,闲来时间,看看JVM,吧自己的一些研究写下来供大家参考,有不对的地方请指正. 废话不多说,一起来看看JVM中类文件是如何 ...

  8. HDU6223——2017ICPC沈阳G Infinite Fraction Path

    题意: 给定一个数字串,每个位子都能向(i*i+1)%n的位子转移,输出路径上,字典序最大的,长度为n的串. 参考:https://www.cnblogs.com/mountaink/p/954144 ...

  9. hdu 1028 Ignatius and the Princess III 母函数

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  10. 用break语句强制结束循环

    以使用二重循环显示九九乘法表的程序代码为例: #include<stdio.h> int main() { int i,j; ;i<=;i++){ ;j<=;j++) prin ...