asp.net core系列 73 Exceptionless+Nlog以及Apollo介绍
一. 介绍
在一上篇中介绍了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介绍的更多相关文章
- asp.net core系列 72 Exceptionless使用介绍
一.Exceptionless介绍 Exceptionless专注于.net平台提供实时错误和日志报告.主要包括:错误通知.智能分组异常.详细错误报告堆栈跟踪.支持离线.UI查看重要错误和确定优先级. ...
- asp.net core系列 74 Exceptionless服务端安装
一. Docker安装 Docker 要求版本Docker 18.09.0+以上 安装地址:https://www.runoob.com/docker/windows-docker-insta ...
- asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用
前言:由于公司占时没有运维,出于微服务的需要,Apollo只能先装在windows 阿里云上跑起来,由于环境及网络等问题,在安装过程中遇到很多坑,算是一个个坑填完后,最终实现. 一. java jdk ...
- ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...
- 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 中,执行该操作的另一种方法 ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- Asp.net Core 系列之--4.事务、日志及错误处理
ChuanGoing 2019-11-17 这篇原本时想把事务处理.日志处理.错误处理.授权于鉴权一并介绍完的,授权和鉴权我想结合自定义权限来介绍,全部放到这里篇幅可能太长,因此权限部分将会在下篇来介 ...
- 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 ...
- [转]ASP.NET Core 开发-Logging 使用NLog 写日志文件
本文转自:http://www.cnblogs.com/Leo_wl/p/5561812.html ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 . ...
随机推荐
- iOS学习——iOS 宏(define)与常量(const)的正确使用
概述 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰.你能区分下面的吗?知道什么时候用吗? #define HSCode ...
- Java基础及JavaWEB以及SSM框架学习笔记Xmind版
Java基础及JavaWEB以及SSM框架学习笔记Xmind版 转行做程序员也1年多了,最近开始整理以前学习过程中记录的笔记,以及一些容易犯错的内容.现在分享给网友们.笔记共三部分. JavaSE 目 ...
- HBase 系列(十一)—— Spring/Spring Boot + Mybatis + Phoenix 整合
一.前言 使用 Spring+Mybatis 操作 Phoenix 和操作其他的关系型数据库(如 Mysql,Oracle)在配置上是基本相同的,下面会分别给出 Spring/Spring Boot ...
- 利用WxJava实现网站集成微信登录功能,核心代码竟然不超过10行
最近网站PC端集成微信扫码登录,踩了不少坑,在此记录下实现过程和注意事项. 本文目录 一.微信开放平台操作步骤1.创建“网站应用”2.获取AppID和AppSecret二.开发指南三.开发实战1.po ...
- SpringBoot项目中如何异步执行一个方法
1. SpringBoot上加上开启异步方法注解:@EnableAsync 2. 在需要异步执行的方法上,加上异步方法注解 @Async 3. 测试 5. 测试结果为,访问127.0.0.1:8888 ...
- Leetcode之回溯法专题-17. 电话号码的字母组合(Letter Combinations of a Phone Number)
[Leetcode]17. 电话号码的字母组合(Letter Combinations of a Phone Number) 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组 ...
- (四)数据持久化(基于YesSql)
ORM框架(持久化流程) session是事务 (transaction) 的工厂,处理session后,所有更改将自动刷新到数据库中.或者,如果要处理何时将更改刷新到数据库,即transaction ...
- session一致性的解决方案
更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文,这个相 ...
- Delphi - 通过WinAPI WinExec直接调用系统工具
看如下代码: WinExec('mspaint.exe', SW_SHOWNORMAL); // SW_SHOWNORMAL = 1 系统画图 WinExec('write.exe', SW_SHOW ...
- Redis各数据结构常用命令
redis 通用API keys * 遍历所有key 一般不在生产环境中使用 redis单线程,容易阻塞其他命令执行 O(n) dbsize 计算key的总数 O(1)exists 检查key是否存在 ...