分布式日志框架Exceptionless之生产环境部署步骤
Exceptionless 是一个开源的实时的日志收集框架,它将日志收集变得简单易用并且不需要了解太多的相关技术细节及配置。本篇基于我的上一篇《基于Exceptionless实现分布式日志》,最近在公司内部搭建日志平台,且部署到了基于阿里云的生产环境,因此做个记录,也希望能帮助到希望基于Exceptionless来做日志平台的朋友们。
一、本地部署前置条件
这里主要参考Exceptionless的Self-Hosting Wiki文档,下面是官方推荐的生产环境的前提条件:
- .NET 4.7
- IIS 7.5+
- PowerShell 3+
- Java JDK 1.8+
- ElasticSearch 5.6.
相信你会有两个疑问:
(1)为何要用.NET 4.7和IIS?
因为Exceptionless的Web Dashboard是基于ASP.NET(基于.NET Framework)实现的,因此需要.NET 4.7(当然4.6.1也是支持的)和IIS(.NET Framework还没有实现跨平台),因此最好是部署在Windows Server上面。因为我要部署的阿里云服务器刚好是一台Windows Server 2016,因此也很方便地安装了.NET 4.7和IIS 10。而PowerShell则是用来跑一个启动相关服务(ElasticSearch + Kibna)的Windows下的PowerShell脚本的,因此可以做到开机启动。
(2)ElasticSearch部署在哪里?
官方推荐ElasticSearch至少三个节点,且至少两个节点部署在Linux系统上。对于数据量不大的内部业务微服务系统,可以直接在Windows Server中部署ElasticSearch,当然官方声明ElasticSearch在Linux中的性能表现更好。而ElasticSearch是基于Java编写的,因此也就需要安装JDK(JRE)来作为运行时,当然你要先安装一下JDK,并将其配置到环境变量中。
因此,基于业务量不大(目前只有一个内部业务系统和一个官方网站在用Exceptionless),我暂且将Web Dashboard和ElasticSearch都部署在Windows Server服务器中。
二、开始本地部署
2.1 下载Exceptionless本地部署包
Exceptionless虽然是一款开源日志平台框架,但是其也有收费版,且收费版支持多语言(包括中文),但是其开源本地部署版还是2017年9月的Release版本。我们要做的第一件事就是去下载Release包:v4.1.0

解压这个zip包后的文件如下:

其中,Start.bat是一个快速安装和启动的批处理文件,它会帮我们调用两个PowerShell脚本(Start-ElasticSearch及Start-WebSite),可以帮助我们安装ElasticSearch + Kibna以及帮我们启动一个IIS Express并部署好Web Dashboard项目。
2.2 安装ElasticSearch
这里我将Start.bat修改为以下一句话,意为只安装ElasticSearch,不让其帮我启动IIS Express来部署Web Dashboard项目。
>>PowerShell .\Start-Elasticsearch.ps1
然后编辑Start-ElasticSearch.ps1这个PowerShell脚本,将其Param部分修改为如下:
Param(
[string]$Version = "5.5.2",
[int]$NodeCount = 2,
[bool]$StartKibana = $false,
[int]$StartPort = 9200,
[bool]$OpenKibana = $true,
[bool]$ResetData = $false
)
这里我选择不启动Kibana,以及将默认的ElasticSearch节点数从一个节点改为了两个节点。
为了能够正常执行PowerShell脚本,先以管理员权限执行一下下面这行命令:
>>Powershell Set-ExecutionPolicy Unrestricted
点击Start.bat,开始调用Start-ElasticSearch进行ElasticSearch的安装和启动,等待一会儿,下载后的文件夹如下图所示:

这时ElasticSearch已经在运行,并监听了9200端口,请不要关闭命令行窗口,因为这时ElasticSearch不是在后台运行的。
当然,我们也可以通过docker来快速部署ElasticSearch到Linux上,例如可以通过以下这个docker-compose.yml文件来快速部署:
version: '3.4' services:
elasticsearch:
image: slideroom/elasticsearch:98
environment:
bootstrap.memory_lock: 'true'
discovery.type: single-node
ES_JAVA_OPTS: '-Xms512m -Xmx512m'
xpack.security.enabled: 'false'
ports:
- 9200:9200
- 9300:9300
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata:/usr/share/elasticsearch/data kibana:
depends_on:
- elasticsearch
image: slideroom/kibana:116
ports:
- 5601:5601 volumes:
esdata:
driver: local
appdata:
driver: local
通过一句简单的命令:docker-compose up -d 即可快速启动ElasticSearch和Kibana。

2.3 部署Web控制台项目
由于我的环境是Windows Server 2016,因此启动IIS,按照老习惯创建一个.NET应用程序池(v4.0)来附加wwwroot文件夹作为Web控制台,端口号默认设为50000。

现在开始进行配置文件的设置:
(1)app.config.xxxx.js
这里主要修改BASE_URL为你的服务器访问IP地址:
(function () {
'use strict';
angular.module('app.config', [])
.constant('BASE_URL', 'http://192.168.16.150:50000')
.constant('EXCEPTIONLESS_API_KEY')
.constant('FACEBOOK_APPID')
.constant('GITHUB_APPID')
.constant('GOOGLE_APPID')
.constant('INTERCOM_APPID')
.constant('LIVE_APPID')
.constant('SLACK_APPID')
.constant('STRIPE_PUBLISHABLE_KEY')
.constant('SYSTEM_NOTIFICATION_MESSAGE')
.constant('USE_HTML5_MODE', false)
.constant('USE_SSL', false);
}());
(2)Web.config
在Web.config中,需要配置如下的一些内容:
<connectionStrings>
<!-- 如果开启了Redis缓冲 -->
<add name="RedisConnectionString" connectionString="192.168.16.151:6379,abortConnect=false" />
<!-- ElasticSearch的访问地址 -->
<add name="ElasticSearchConnectionString" connectionString="http://192.168.16.150:9200" />
<add name="LdapConnectionString" connectionString="" />
</connectionStrings>
当然,如果你已经在Linux中安装了ES,那么直接修改Web.config的ElasticSearch的连接字符串即可。
其次,是appSettings中的一些基本信息:
<appSettings>
<!-- Base url for the ui used to build links in emails and other places. -->
<add key="BaseURL" value="http://192.168.16.150:50000/#" />
<!-- Controls whether SSL is required. Only enable this if you have SSL configured. -->
<add key="EnableSSL" value="false" />
<!--
Dev: Use this mode when debugging. (Outbound emails will not be sent)
QA: Use this mode when deployed to staging. (Outbound emails restricted)
Production: Use this mode when deployed to production.
-->
<add key="WebsiteMode" value="Production" />
<!-- Controls whether users can signup. -->
<add key="EnableAccountCreation" value="true" />
<!-- Controls whether daily summary emails are sent -->
<add key="EnableDailySummary" value="true" />
......
</appSettings>
这里主要是修改BaseURL(你要公布的Web端的访问地址)和WebsiteMode(这里选择Production,此模式下默认允许出站邮件发送)。
最后,是关于邮件的基本配置,以便能够正常的发送邮件:
<add key="SmtpHost" value="smtp.exmail.qq.com" />
<add key="SmtpPort" value="465" />
<add key="SmtpEncryption" value="SSL" />
<add key="SmtpFrom" value="edisonchou@companyname.com" />
<add key="SmtpUser" value="edisonchou@companyname.com" />
<add key="SmtpPassword" value="your-password" />
*.这里记得一定要加上SmtpFrom,而且SmtpFrom需与SmtpUser保持一致。
其他几个需要了解的设置,这里我使用默认配置,不更改其Value:
<!-- 异常数据-默认存储在文件夹storage中 -->
<add key="StorageFolder" value="|DataDirectory|\storage" />
<!-- 在当前Web网站进程中运行Jobs -->
<add key="RunJobsInProcess" value="true" />
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
<!-- 保留日志天数 -->
<add key="MaximumRetentionDays" value="90" />
<!-- 分片数量 -->
<add key="ElasticSearchNumberOfShards" value="3" />
<!-- 复制分片数量 -->
<add key="ElasticSearchNumberOfReplicas" value="1" />
三、将ElasticSearch设置为开机启动项
由于Exceptionless依赖于ElasticSearch,因此需要将ES设为开机启动或Windows服务。可以使用NSSM或直接将Start.bat加入计划任务,不再赘述。

四、配置ASP.NET Core客户端
安装Exceptionless的ASP.NET Core客户端:
NuGet>>Install-Package Exceptionless.AspNetCore
*.目前最新版本为1.0.2
在StartUp启动类中,分别注入封装的Logger和使用Exceptionless中间件
public static class ExceptionlessBuilderExtensions
{
public static IApplicationBuilder UseExceptionless(this IApplicationBuilder app, IConfiguration configuration)
{
var isEnableLogger = Convert.ToBoolean(configuration["Exceptionless:Enabled"] ?? "false");
if (isEnableLogger)
{
// 封装使用Exceptionless分布式日志组件
ExceptionlessClient.Default.Configuration.ApiKey = configuration["Exceptionless:ApiKey"];
ExceptionlessClient.Default.Configuration.ServerUrl = configuration["Exceptionless:ServerUrl"];
ExceptionlessClient.Default.SubmittingEvent += OnSubmittingEvent;
app.UseExceptionless();
} return app;
} private static void OnSubmittingEvent(object sender, EventSubmittingEventArgs e)
{
// 只处理未处理的异常
//if (!e.IsUnhandledError)
//{
// return;
//} // 忽略404错误
if (e.Event.IsNotFound())
{
e.Cancel = true;
return;
} // 忽略没有错误体的错误
var error = e.Event.GetError();
if (error == null)
{
return;
} // 忽略 401 (Unauthorized) 和 请求验证的错误.
if (error.Code == "" || error.Type == "System.Web.HttpRequestValidationException")
{
e.Cancel = true;
return;
} // Ignore any exceptions that were not thrown by our code.
//var handledNamespaces = new List<string> { "Exceptionless" };
//if (!error.StackTrace.Select(s => s.DeclaringNamespace).Distinct().Any(ns => handledNamespaces.Any(ns.Contains)))
//{
// e.Cancel = true;
// return;
//} // 添加附加信息.
//e.Event.Tags.Add("EDC.Core");
//e.Event.MarkAsCritical();
}
}
其他配置和用法,请参考我的这一篇《基于Exceptionless实现分布式日志》来使用。
下面是配置好后的Web控制台:

如果需要获得邮件通知及发送邮件到注册用户进行验证:

如果要获得每日的项目报告,请记得将Web.config中EnableDailySummary设为true。个人觉得邮件通知critical errors的功能很实用,再多的notification就是骚扰了。因此,我只勾选了一个critical errors。此外,要启用邮件通知,请先通过注册发送给你的email进行账户验证(如下图所示),否则无法启用邮件通知。

Then, enjoy your bug exceptions :

五、一些其他注意事项
这里可以参考园友 花儿笑弯了腰 的这篇《Self Host 使用 Exceptionless 实时监控程序运行日志服务》,他讲述了一些QA,也许会有你也遇到的坑:

参考资料
Exceptionless GitHub
Exceptionless Self-Host Document
Ants,《部署用于生产环境的Exceptionless》
uptothesky,《Exceptionless本地部署》
uptothesky,《Exceptionless邮箱配置》
akaxb,《Exceptionless本地部署小结》
依乐祝,《Exceptionless安装配置及简单实用》
花儿笑弯了腰,《Self Host 使用 Exceptionless 实时监控程序运行日志服务》
分布式日志框架Exceptionless之生产环境部署步骤的更多相关文章
- .NET开源分布式日志框架ExceptionLess实战演练(公开版)
一.课程介绍 在以前,我们做日志收集大多使用 Log4net,Nlog 等框架,在应用程序变得复杂并且集群的时候,可能传统的方式已经不是很好的适用了,因为收集各个日志并且分析他们将变得麻烦而且浪费时间 ...
- .Net Core 集成ExceptionLess分布式日志框架之本地化部署
前言 公司目前使用的项目中关于日志记录这块,之前一直都是使用的Log4net 存放于后台文件中的,对于异常错误啊,或者需要查看一些详情错误的时候感觉很不方便,要到服务器上去打开日志文件检索错误,降低了 ...
- 如何扩展分布式日志组件(Exceptionless)的Webhook事件通知类型?
写在前面 从上一篇博客高并发.低延迟之C#玩转CPU高速缓存(附示例)到现在又有几个月没写博客了,啥也不说,变得越来越懒了,懒惰产生了拖延后遗症. 最近一周升级了微服务项目使用的分布式日志组件Exce ...
- 10: Django + Uwsgi + Nginx 的生产环境部署
1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI: 最早的协议 2. FCGI: 比CGI快 ...
- Django+Nginx+uWSGI生产环境部署
生产环境中的数据流 参考文档: wsgi详解:https://blog.csdn.net/li_101357/article/details/52748323 wsgi协议介绍(萌新版):https: ...
- log4go的日志滚动处理——适应生产环境的需要
日志处理有三类使用环境,开发环境DE,测试环境TE,生产环境PE. 前两类可以看成是一类,重要的是屏幕显示--termlog.生产环境中主要用的是socklog 和 filelog,即网络传输日志和文 ...
- Django + Uwsgi + Nginx 的生产环境部署
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...
- Spring Boot (二)集成Jsp与生产环境部署
一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...
- 【原创】大数据基础之Airflow(2)生产环境部署airflow研究
一 官方 airflow官方分布式部署结构图 airflow进程 webserver scheduler flower(非必须) worker airflow缺点 scheduler单点 通过在sch ...
随机推荐
- DDGScreenShot--iOS 图片处理--多图片拼接 (swift)
写在前面 最近总结了关于图片处理相关的内容,之前在二三四五工作的时候,也做过关于这方面的分享,图片的处理内容很多,会分很多模块来讲解. 今天简单讲多图片的拼接. 上代码 func composeIma ...
- 微信小程序之获取用户位置权限(拒绝后提醒)
微信小程序获取用户当前位置有三个方式: 1. wx.getLocation(多与wx.openLocation一起用) 获取当前的精度.纬度.速度.不需要授权.当type设置为gcj02 返回可用于w ...
- lambda函数常见用法
# lambda 参数:返回值/表达式 # print((lambda :100)()) # f = lambda a,b : a + b # print(f(10, 20)) # f = lambd ...
- Android自动化框架介绍
随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的 ...
- Apache 、Tomcat、Nginx的区别
一. 定义: 1. Apache Apache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机平台上.其属于应用服务器.Apache支持支持模块多,性能稳定,Apache本身是 ...
- Mybatis中几个重要类
http://www.open-open.com/lib/view/open1363572227609.html
- 【转】MySQL int转换成varchar引发的慢查询
转自http://www.cnblogs.com/billyxp/archive/2013/05/31/3110016.html 最近一周接连处理了2个由于int向varchar转换无法使用索引,从而 ...
- Switch在swift中的使用
switch的简单使用: 相比 C 和 objective - C 中的 switch 语句,Swift 中的 switch 语句不会默认的掉落到每个 case 的下面进入 另一个 case.相反,第 ...
- SSM-SpringMVC-01:SpringMVC是什么?SpringMVC执行流程
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- SpringMVC简介: SpringMVC也叫Spring Web mvc,属于表现层的框架.Sprin ...
- Intent的跳转和传值
看了Intent的使用方法,感觉还是要做一些笔记的,首先对于Intent的跳转Activity这个功能的实现就有两种方法,也可以说有三种: 1. 2.