分布式日志框架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 ...
随机推荐
- Java虚拟机-内存tips
java虚拟机内存可以分为独占区和共享区. 独占区:虚拟内存栈.本地方法栈.程序计数器. 共享区:方法区.Java堆(用来存放对象实例). 程序计数器 比较小的内存空间,当前线程所执行的字节码的行号指 ...
- 微信小程序-设计指南
基于微信小程序轻快的特点,官方拟定了小程序界面设计指南和建议,可作为小程序开发参考. 友好礼貌 -避免用户使用服务时被周围环境干扰,设计时应减少无关设计对用户的影响,礼貌的向用户提供服务,友好的引导用 ...
- arcengine之版本管理
public void VersionManagement(IVersionedWorkspace versionedWorkspace) { //creating the new version o ...
- AUTOSAR ArcticCore重构 - for_each_HOH
Arctic Core是AUTOSAR的实现,早期版本是开源的. 基本问题 在ARM架构下对CAN driver的实现(arch/arm/arm_cm3/drivers/Can.c)中,有这样一段代码 ...
- 第四章 MySQL数据类型和运算符
5.1 MySQL数据类型介绍 一.数据类型简介 (1) 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容 (2) 不同的数据类型也决定了 My ...
- Docker 跨主机网络方案分析
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- 统一流控服务开源-1:场景&业界做法&算法篇
最近团队在搞流量安全控制,为了应对不断增大的流量安全风险.Waf防护能做一下接入端的拦截,但是实际流量会打到整个分布式系统的每一环:Nginx.API网关.RPC服务.MQ消息应用中心.数据库.瞬间的 ...
- JDK1.8的新特性
JAVA8新特性 接口改善 现在接口里已经完全可以定义静态方法了. 举一个比较普遍的例子就是在java类库中, 对于一些接口如Foo, 都会有一个有静态方法的工具类Foos 来生成或者配合Foo对象实 ...
- 【转】spring cloud eureka 参数配置
eureka.client.registry-fetch-interval-seconds 表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅 ...
- 浅析mydumper
Ⅰ.背景 mysqldump单线程备份,很慢 恢复慢,一张表一张表恢复, 如果备份了100G的数据,想恢复其中一个表,做不到(所有的表都在一个文件里) 所以推荐使用mydumper备份 备份并行,基于 ...