作者: markjiang7m2
官网地址: http://letyouknow.net/
今天要给大家介绍的 Exceptionless 是一个基于 .net core 的开源日志框架, Exceptionless 的意思是: 没有异常. Exceptionless 可以为 ASP.NET, web API, WebForms, WPF, 控制台和 MVC 应用程序提供实时错误, 功能和日志报告. 它将收集的信息组织成简单的可操作数据, 这将有助于您的应用程序变得无异常. 最重要的是, 它是开源的!
Exceptionless 官网: https://exceptionless.com/
说明文档:
GitHub: https://github.com/exceptionless/Exceptionless/
快速入门
Exceptionless 支持直接调用官网服务记录日志, 这样可以非常快速地在我们的应用中使用 Exceptionless, 下面我们来看看具体的步骤.
1. 创建免费账号
在 https://be.exceptionless.io/signup 中创建一个免费账号, 只需要提供用户名, 密码以及邮箱即可, 非常简单.
2. 登录并创建项目
3. 获得属于这个项目的 API 密钥
4. 配置应用
在我们的应用中安装 Exceptionless, 在 Nuget 中直接搜索 Exceptionless.AspNetCore 进行安装, 或者在 VS 内置 Powershell 中执行下面命令
Install-Package Exceptionless.AspNetCore
在 Startup.cs 的 Configure 方法中添加 Exceptionless 的使用
这里就用到前面的 API 密钥, 当然可以将这个密钥添加到 appsettings.JSON 文件中, 这样用起来更灵活
- using Exceptionless;
- public void Configure(IApplicationBuilder App, IHostingEnvironment env)
- {
- if (env.IsDevelopment())
- {
- App.UseDeveloperExceptionPage();
- }
- App.UseExceptionless("[你的 API 密钥]");
- App.UseMvc();
- }
在代码中捕获并记录异常. 这里我为了马上看出效果, 自己主动抛了一个异常
- // GET API/values/{id}
- [HttpGet("{id}")]
- public ActionResult<string> Get(int id)
- {
- try
- {
- throw new Exception();
- }
- catch (Exception ex)
- {
- ex.ToExceptionless().Submit();
- }
- return $"value {id}";
- }
5. 运行并查看日志报告
我这里是直接用 Debug 模式运行测试. 这里有个 Dashboard 显示异常记录的统计信息
点击某一条具体的异常记录, 可以查看具体的异常信息
这就是使用官网提供服务的流程. 使用非常的简单, 但在使用上也会存在一定的问题.
实测发现, 应用抛出异常后并不能立刻在 Exceptionless 网站中看到异常记录, 需要等待一定的时间
天下没有免费的午餐, 如果需要商用还是要交钱升级服务, 价目表如下. 我测试使用的是免费版, 只能创建一个项目, 每个月只能提交 3000 条记录, 而且这些记录只能保存 3 天, 这对于商用肯定是不足够的.
本地部署 Exceptionless
Exceptionless 是开源的, 所以它也支持我们进行本地化部署, 官方文档说明在这里
前期准备
- .NET 4.6.1
- Java JDK 1.8+
设置 JAVA_HOME 环境变量
- IIS Express 8+
- Powersell 3+
更改 Powershell 脚本执行策略为 Unrestricted(以管理员身份运行 CMD, 执行命令行
- powershell Set-ExecutionPolicy Unrestricted
- )
因为 Exceptionless 是使用 Elasticsearch 进行实时搜索, 而 Elasticsearch 是 Java 实现的, 所以需要安装 Java JDK
1. 下载 Exceptionless 最新版 Release
2. 快速启动 Exceptionless
解压 Exceptionless 压缩包, 直接双击 Start.bat 批处理文件, 它就会自动帮我们安装运行 Elasticsearch,Kibana 并启动一个 IIS Express 运行 Exceptionless Web 项目
我这里为了能看到批处理文件的输出信息, 在 bat 文件中最后添加了一行 @pause, 就是让它执行完之后不自动关闭窗口
文件夹 wwwroot 就是 Exceptionless Web 项目所包含的部署文件
不过, 很不幸, 我并没有马上成功..CMD 输出以下错误信息
Invoke-WebRequest : 请求被中止: 未能创建 SSL/TLS 安全通道.
一顿搜索得到的结论就是要在请求命令前面多加一行下面的命令
[System.NET.ServicePointManager]::SecurityProtocol=[System.NET.SecurityProtocolType]::Tls12
根源和解决办法是在这里找到的
大概意思就是我的电脑同时安装了. NET 4.0 和. NET 4.5 或更高版本, 这导致加密协议的默认值为 SSLv3 和 TLSv1, 而 Powershell 需要使用 Tls12 才能正常使用 Invoke-WebRequest.
于是, 我打开 Start-Elasticsearch.ps1 文件, 分别在两处 Invoke-WebRequest 命令前添加了上面的命令, 注意是两处
(当然, 这里也可以用另外一个方法绕过这个问题, 就是看看 Powershell 脚本中要下载的是什么文件, 自己单独先把文件下载好放在它指定的位置就可以了, 我就是这么干的.. 不过我是因为 Powershell 这个下载太慢了)
OK, 重新执行 Start.bat, 可以正常下载, 也启动了 Elasticsearch 和 Kibana
看起来像是正常启动了, 然后, 浏览器中打开 http://localhost:50000 / 却得到了这个
这又是为何呀? 看了一下 Start-Website.ps1 文件, 好像也没什么特别的, 所以我第一反应是 50000 端口可能被占用了
结果一查, 还真的是, 我的有道词典..
好吧, 我换 50001 总该行了吧. 当然这里也要注意下, 更换端口有 3 个地方需要改的, 要是没改好, 即使网站运行起来了也没办法进行注册等操作
首先是 Start-Website.ps1 文件中最后两行
- Start-Website $wwwroot 50001
- Start-Process "http://localhost:50001"
然后是 wwwroot 文件夹中的 Web.config
<add key="BaseURL" value="http://localhost:50001/#" />
还有很容易被忽略的 App.config.77fc9ddd679d37dc.JS
- angular.module('app.config', [])
- .constant('BASE_URL', 'http://localhost:50001')
再一次执行 Start.bat, 满心欢喜地在浏览器打开 http://localhost:50001/. 额, 然而还是失败, 查看 50001 端口, 发现并没有任何程序占用, 那也以为着 Exceptionless Web 没有正常启动.
因为 Elasticsearch 和 Kibana 都正常启动, 而且请求也正常, 意味着 Start-Elasticsearch.ps1 这个脚本的执行过程是正常的, 那就把焦点专注在 Start-Website.ps1 上面了.
这文件上面核心的就是一句
cmd /c start cmd /k "$iisExpressExe" "/port:$port" "/path:$path"
根据我的环境, 它最终运行的脚本应该是这样的
cmd /c start cmd /k "C:\Program Files\IIS Express\iisexpress.exe" "/port:50001" "/path:D:\Program Files\Exceptionless.4.1.2861\wwwroot"
好吧, 这个时候我才留意到有这么一个窗口 (回家换了个电脑继续.. 大家自动忽略截图的不一致)
'C:\Program' 不是内部或外部命令, 也不是可运行的程序
或批处理文件.
那我大概猜到是什么问题了, 这里应该是路径 C:\Program Files\IIS Express\iisexpress.exe 中含有空格导致的.
既然它是执行批处理命令, 那我直接在 CMD 下面执行下面这个命令应该是没有问题的
"C:\Program Files\IIS Express\iisexpress.exe" "/port:50001" "/path:D:\Program Files\Exceptionless.4.1.2861\wwwroot"
Bingo, 就是它了
那如果非得要在 Powershell 来执行, 有没有办法呢? 其实, 也是有的, 但因为我对 Powershell 不太熟悉, 所以只找了一种, 但是感觉这不是最优解
把前面的命令行改为下面这个
cmd /c start cmd /k "C:\Progra~1\IISExp~1\iisexpress.exe" "/port:50001" "/path:D:\Program Files\Exceptionless.4.1.2861\wwwroot"
这里就是把 Program Files 改为 Progra~1,IIS Express 改为 IISExp~1, 基本语法是, 去除空格后取得前面的六个字母,~ 表示省略后面的字符, 然后 1 是表示第一个匹配的文件夹
这是我在 Windows 系统下部署 Exceptionless 过程中遇到的问题, 但因为在官网上的介绍是直接双击运行 Start.bat 就完成部署的, 不知道其他朋友有没有遇到跟我一样的问题.
我这里就没有继续纠结怎么修改 Start-Website.ps1 文件里面的脚本了哈, 各位有感兴趣的朋友可以研究后在留言区分享一下.
当然了, 前面这么麻烦只是为了找出问题的原因, 但如果回到本质, 这个脚本就是为了用 IIS Express 部署 Exceptionless Web 站点, 那其实我们更普遍的是直接用 IIS 管理器新建一个站点就可以了.
重新整理这个启动流程, 就是下载并启动 Elasticsearch 和 Kibana 服务, 然后部署 Exceptionless Web 站点.
所以, 我们可以按照下面这个步骤:
执行
Start-Elasticsearch.ps1
启动 Elasticsearch 和 Kibana 服务
IIS 管理器部署 Exceptionless Web 站点, 设置端口 50001
3. Exceptionless 注册用户
这里跟前面使用官网服务时是一样的, 注册用户, 新建项目, 获得 API 密钥
4. 应用集成本地 Exceptionless
在应用中使用本地服务跟官网服务也基本相同, 只是需要将默认的 Exceptionless 服务地址改为本地的
Startup.cs 中的 Configure 方法
- ExceptionlessClient.Default.Configuration.ApiKey = Configuration.GetSection("Exceptionless:ApiKey").Value;
- ExceptionlessClient.Default.Configuration.ServerUrl = Configuration.GetSection("Exceptionless:ServerUrl").Value;
- App.UseExceptionless();
这里我就将两个配置项放到了 appsettings.JSON 文件里
- "Exceptionless": {
- "ApiKey": "4pyCA8KFr3YekuVStkIbaE7Hqq1YIZAR6vH8OrYh",
- "ServerUrl": "http://localhost:50001"
- }
运行之后就可以看到 Exceptionless 上有异常的记录
而且, 我们也可以看到异常记录数量是没有限制的
总结
本文主要是介绍了如何快速应用 Exceptionless 记录异常, 以及如何进行本地化部署, 然后就是在我自己进行试验的过程中踩到的坑, 当然了 Exceptionless 还有很多功能, 以及本地化时的一些设置在本文中都是没有涉及到的, 目前我介绍的也就是一个能用的阶段, 哈哈, 后面我有深入的时候再给大家总结. 今天就先跟大家介绍到这里, 希望大家能持续关注我们.
参考文献
本文在编写过程中引用或参考了以下文章中的部分内容, 如有侵权, 请联系修改或删除.
https://www.cnblogs.com/edisonchou/p/exceptionless_deployment_on_production_env_introduction.html
来源: https://www.cnblogs.com/markjiang7m2/p/11020140.html