Exceptionless (2 개) - 고급 사용

Exceptionless (2 개) - 고급 사용

저자 : markjiang7m2
원래 주소 : https://www.cnblogs.com/markjiang7m2/p/11100563.html
공식 웹 사이트 주소 : http://letyouknow.net

이전 기사에서 Exceptionless - 닷넷 핵심 오픈 소스 프레임 워크를 로깅 Exceptionless에서의 배포를 지역화하는 방법에 대한 이야기,하지만 난 당신이 있다는 것입니다, 그리고 무대의 사용으로 제한됩니다 말한다. 글쎄, 난 계속 오늘은 좋은 재사용하는 방법을 탐구한다.

백그라운드에서 실행중인 서비스

마지막으로 나는 스크립트를 직접 Start-ElasticSearch.ps1ElasticSearch와 키바 서비스를 시작,하지만 우리는 또한 서비스가 종료됩니다, 윈도우가 실수로 닫혀있는 경우 서비스가,이 명령 창뿐만 아니라,하고 실행 것을 볼 수 있으며, 서버가 다시 시작되면,이 두 서비스가 자동으로 시작되지 않습니다.
나는 일시적으로 던져 ElasticSearch 서비스를 살펴 키바 따로 넣어 왔어요. ElasticSearch는 백그라운드에서 실행되는 Windows 서비스로 설치 직접 스크립트를 지원 ElasticSearch있다.

less_23_searchservicebat

이것은이다 elasticsearch-service.bat어떤 매개 변수 지원하는 스크립트 :

  • 설치 서비스로 설치합니다 Elasticsearch
  • 제거 제거 설치 Elasticsearch 서비스를 (그리고 시작했을 때 서비스를 중지)
  • 시작 Elasticsearch 서비스를 시작 (설치된 경우)
  • 정지 Elasticsearch 서비스를 중지 (시작하는 경우)
  • 관리자가 설치된 서비스를 관리 할 수있는 GUI를 시작합니다

설치
명령 줄은 입력 elasticsearch-service.bat한 후 디렉토리 상주, 다음과 같은 스크립트를 실행

elasticsearch-service.bat install

출발

less_25_servicestarted

우리가 직접 브라우저에 액세스 할 수 있습니다이 시간 9200인터페이스는 정상적인 서비스 여부를 확인합니다

less_26_serviceconfirm

마지막으로 배치 Exceptionless를 계속 사용
(Exceptionless 웹 서비스를 배포 할 IIS를 사용하는 방법을 참조하십시오 Exceptionless을 - 닷넷 핵심 오픈 소스 로깅 프레임 워크 )

나는 ElasticSearch 노드를 반환하기 전에 직접, 그리고 당신이 다시 직접 이전에 등록 된 계정으로 로그인 할 수 있도록 명확한 데이터는 없기 때문에

less_27_weblogin

또한 성공, ElasticSearch 서비스가 이미 백그라운드에서 실행됩니다.

자동 시작
GUI가 자동으로 시작하도록 설정 ElasticSearch 서비스가 제공 될 수

elasticsearch-service.bat manager

Startup Type선택이 될 것입니다 Automatic후 저장하려면 확인을 클릭합니다

less_28_serviceauto

따라서, 서버를 다시 시작하고 경우에도 우리의 서비스가 자동으로 ElasticSearch를 시작합니다

사실, Windows 서비스는 친구가 알고 있어야 연주 한 작업의 일부는 위의 완료 할 수 있습니다 Windows 서비스 관리자에서 온다

실행 창 서비스를 열려면 명령 "WIN + R"을 누릅니다. 실행 창 서비스에 services.msc를 입력

GUI를 조작 그냥 동일로 목록도 볼 수 ElasticSearch 서비스는, 속성 창을 열려면 더블 클릭

less_29_windowsservice

의 Web.config를 봐

난 그냥 포트 설정 Exceptionless을 마지막으로 변경된 시간은, 사실, 또한 구성 많은 정보가 포함되어

<add name="RedisConnectionString" connectionString="localhost:6379,abortConnect=false" />
<add name="ElasticSearchConnectionString" connectionString="http://localhost:9200" />

공식을 설치하고 상태를 잃지 않고 여러 인스턴스 다시 시작을 실행할 수 있도록, 레디 스를 구성하는 것이 좋습니다, 강력 레디 스가 3.0 리눅스에서 실행되는 버전이 것이 좋습니다 RedisConnectionString레디 스의 연결 문자열입니다

ElasticSearchConnectionString여러 노드가있는 경우 필요한 점 ElasticSearch 서비스는 사용되어 ,분리

<!-- Exceptionless Web 基础Url -->
<add key="BaseURL" value="http://localhost:50001/#" />
<!-- 是否启用ssl -->
<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" />

网站模式WebsiteMode主要是限制邮件发送,默认值是Dev,不发送邮件,所以我这里设置为Production

邮件发送配置,记得跟上面的WebsiteMode一起配置

<add key="SmtpHost" value="smtp.qq.com" />
<add key="SmtpPort" value="25" />
<add key="SmtpEncryption" value="SSL" />
<add key="SmtpUser" value="[email protected]" />
<add key="SmtpPassword" value="xxx" />

我在案例中使用的是自己的qq邮箱。我在qq邮箱中已经开启了SMTP服务,并且也通过一个控制台应用程序测试可以发送邮件。
但是在Exceptionless这里一样的设置就是不行,在Web中点击发送邮件,log记录错误如下:
ERROR MailMessageJob Job run "MailMessageJob" failed: 由于意外的数据包格式,握手失败。 System.IO.IOException: 由于意外的数据包格式,握手失败。

清除Url
我们现在使用的Url都会带有#!,例如

http://localhost:50001/#!/type/error/dashboard

可以按照下面步骤清除字符#!

  • 首先保证你的IIS是否已经安装了重写模块,可通过双击IIS中的模块查看是否包含了RewriteModule
  • 更新Web.config文件
    • 释放出在system.webServer中的rewrite节点
    • 删除BaseURL值中的/#
    • 注释了在system.webServer\modules中的<remove name="RewriteModule" />标签
  • 修改app.config.77fc9ddd679d37dc.js文件中USE_HTML5_MODE的值为true

进程外运行作业
默认情况下,所有作业都在当前的Web进程中运行。如果发现事件处理开始变慢的时候,可以启动并扩展多个作业实例。通过在进程外运行作业,可以确保所有作业是否正常运行。

  • 首先是要配置安装Redis,这样可以保证Exceptionless与作业之间能够进行通信
  • 更新Web.config中的RunJobsInProcess值为false
  • 更新作业的配置,有两种方法可选:
    • 使用环境变量进行配置Exceptionless。新增环境变量Exceptionless_{SETTING NAME} (例如: Exceptionless_BaseURL, Exceptionless_ElasticSearchConnectionString)。这是官方推荐的方法,因为它更简单,而且当部署到azure时非常好用
    • 打开App_Data\jobs文件夹,然后按照在根目录中Web.config的配置,再重新配置每个作业的xxx.exe.config
  • 在每个作业文件夹中都有一个run.bat文件,双击它就会运行这个作业。当然,也可以将这些作业全部设置为Windows服务在后台运行

更多设置
除了上面提到的设置,Exceptionless还支持很多自定义配置,下面是全部的设置列表,大家可根据自己的需要进行定制
列表按照这个格式进行排列:设置项 (数据类型,默认值)

EnableSSL (bool)
BaseURL (string)
InternalProjectId (string, "54b56e480ef9605a88a13153")
WebsiteMode (WebsiteMode, "Dev")
AppScope (string, String.Empty)
TestEmailAddress (string)
AllowedOutboundAddresses (List<string>, "exceptionless.io")
RunJobsInProcess (bool, true)
BotThrottleLimit (int, 25)
ApiThrottleLimit (int, Int32.MaxValue)
EventSubmissionDisabled (bool)
MaximumEventPostSize (long, 1000000)
MaximumRetentionDays (int, 180)
EnableDailySummary (bool)
MetricsServerName (string, "127.0.0.1")
MetricsServerPort (int, 8125)
EnableMetricsReporting (bool)
RedisConnectionString (string)
EnableRedis (bool)
DisableSnapshotJobs (bool)
DisableIndexConfiguration (bool)
ElasticSearchConnectionString (string)
ElasticSearchNumberOfShards (int, 1)
ElasticSearchNumberOfReplicas (int)
EnableElasticsearchTracing (bool)
LdapConnectionString (string)
EnableActiveDirectoryAuth (bool)
EnableSignalR (bool, true)
Version (string)
EnableIntercom (bool)
IntercomAppSecret (string)
EnableAccountCreation (bool, true)
MicrosoftAppId (string)
MicrosoftAppSecret (string)
FacebookAppId (string)
FacebookAppSecret (string)
GitHubAppId (string)
GitHubAppSecret (string)
GoogleAppId (string)
GoogleAppSecret (string)
GoogleGeocodingApiKey (string)
EnableBilling (bool)
StripeApiKey (string)
StorageFolder (string)
AzureStorageConnectionString (string)
EnableAzureStorage (bool)
BulkBatchSize (int, 1000)
SmtpHost (string)
SmtpPort (int, 587)
SmtpEnableSsl (bool, true)
SmtpUser (string)
SmtpPassword (string)

更多日志类型

Exceptionless除了支持记录Exception,也可以记录LogMessage、Broken Links 、Feature Usages

LogMessage
LogMessage支持多种级别的日志信息

  • Other
  • Trace
  • Debug
  • Info
  • Warn
  • Error
  • Fatal
  • Off

用法也很简单,直接在你想要记录日志的地方直接加一句

ExceptionlessClient.Default.CreateLog("日志信息", LogLevel.Debug).AddTags("tag1", "tag2").Submit();

所以我们在应用的过程中,可以添加一个统一的接口

public interface ILogger
{
    void Debug(string message, params string[] tags);
    void Error(string message, params string[] tags);
    void Fatal(string message, params string[] tags);
    void Info(string message, params string[] tags);
    void Off(string message, params string[] tags);
    void Other(string message, params string[] tags);
    void Trace(string message, params string[] tags);
    void Warn(string message, params string[] tags);
}
using Exceptionless;
using Exceptionless.Logging;
public class ExceptionlessLogger : ILogger
{
    public void Debug(string message, params string[] tags)
    {
        ExceptionlessClient.Default.CreateLog(message, LogLevel.Debug).AddTags(tags).Submit();
    }

    public void Error(string message, params string[] tags)
    {
        ExceptionlessClient.Default.CreateLog(message, LogLevel.Error).AddTags(tags).Submit();
    }

    public void Fatal(string message, params string[] tags)
    {
        ExceptionlessClient.Default.CreateLog(message, LogLevel.Fatal).AddTags(tags).Submit();
    }

    public void Info(string message, params string[] tags)
    {
        ExceptionlessClient.Default.CreateLog(message, LogLevel.Info).AddTags(tags).Submit();
    }

    public void Off(string message, params string[] tags)
    {
        ExceptionlessClient.Default.CreateLog(message, LogLevel.Off).AddTags(tags).Submit();
    }

    public void Other(string message, params string[] tags)
    {
        ExceptionlessClient.Default.CreateLog(message, LogLevel.Other).AddTags(tags).Submit();
    }

    public void Trace(string message, params string[] tags)
    {
        ExceptionlessClient.Default.CreateLog(message, LogLevel.Trace).AddTags(tags).Submit();
    }

    public void Warn(string message, params string[] tags)
    {
        ExceptionlessClient.Default.CreateLog(message, LogLevel.Warn).AddTags(tags).Submit();
    }
}

然后在Startup.csConfigureServices方法注入ExceptionlessLogger

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ILogger, ExceptionlessLogger>();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

这样就可以更方便地使用了

public class ValuesController : ControllerBase
{
    public ILogger _logger;
    public ValuesController(ILogger logger)
    {
        _logger = logger;
    }
    
    // GET api/values/{id}
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        try
        {
            _logger.Info("Test msg", "tag1", "tag2");
            throw new Exception();
        }
        catch (Exception ex)
        {
            ex.ToExceptionless().AddTags("tag1", "tag2").Submit();
        }
        return $"value {id}";
    }
}

Broken Links
记录404找不到请求的日志

像我这里没有添加favicon.ico图标,使用Chrome浏览器会自动请求这个资源,因此,Exceptionless就记录了这样的日志

less_30_brokenlinks

也可以直接在Api服务中调用如下面语句添加这种类型的日志

ExceptionlessClient.Default.CreateNotFound("404 not found").SetType("404").SetSource($"api/values/{id}");

Feature Usages
类似的也可以添加Feature Usages日志

ExceptionlessClient.Default.CreateFeatureUsage("Feature 1").SetSource($"api/values/{id}").SetType("FeatureType").Submit();

事件

上面所说的所有日志类型,最终都会通过事件进行记录,Exceptionless也支持我们直接记录一个事件

例子如下:

var dataDic = new Exceptionless.Models.DataDictionary();
dataDic.Add("key", "value");
ExceptionlessClient.Default.SubmitEvent(new Exceptionless.Models.Event
{
    Count = 1,
    Date = DateTime.Now,
    Data = dataDic,
    Geo = "geo",
    Message = "message",
    ReferenceId = "referencelId",
    Source = "source",
    Tags = new Exceptionless.Models.TagSet() { "tags" },
    Type = "type"
});

Exceptionless同时也支持我们捕获事件提交过程和事件提交后的事件,这样我们就可以在过程中做一些操作,例如可以忽略404的请求,或者针对某些特殊日志返回某些信息

为了代码的整洁,可以将Exceptionless的配置单独放到一个cs文件中

添加一个ExceptionlessBuilderExtensions

public static class ExceptionlessBuilderExtensions
{
    public static IApplicationBuilder UseExceptionless(this IApplicationBuilder app, IConfiguration configuration)
    {
        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.Event.IsNotFound())
        {
            e.Cancel = true;//取消事件提交
            return;
        }

        // 修改日志信息
        if (e.Event.Source == "sourceA")
        {
            e.Event.AddTags("systemLog");
        }

        //TODO:
    }

    private static void OnSubmittedEvent(object sender, EventSubmittedEventArgs e)
    {
        // 做点什么东西
        if (e.Event.Source == "sourceA")
        {
            //TODO:
        }
    }
}

然后修改Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ……

    app.UseExceptionless(Configuration);

    ……
}

Exceptionless 日志查询

Exceptionless Web站点已经帮我们做好项目、时间、日志类型的分类,大家可以很直观地进行操作查询。
我这里要关注的是Filter查询

前面记录日志的时候,有添加了tagType等信息,这时候就可以使用Filter进行查询了。
语法:

[FilterType]:[value1] {or} {[value2]}

or是用于查询多个该类型值的日志时使用

例如:tag:tag1

less_32_filtertag

列几个可能比较常用的

  • source:"my log source" or "my log source"
  • type:error
  • level:Error
  • ip:127.0.0.1

如果是要同时输入多种类型的条件:

[FilterType]:[value] {OR|AND} {[FilterType]:[value]}

例如:tag:tag1 OR ip:127.0.0.1

更多的语法可以看官网说明
https://github.com/exceptionless/Exceptionless/wiki/Filtering-Searching

总结

이 기사에서는 일시적으로 스트레스 관련하지 않았다, 나는 이것은 단지 데모, 나는 기본적으로 Exceptionless자가 다시 그것을 할 호스팅 함께 소개되었다, 그러나 몇 가지가있다 실질적인 환경이 없기 때문에, 그래서 그것을하지 않습니다 테스트, 그래서 제품이 몇 가지 정말 프로덕션 환경에서 성능이 많이 함께 사용하면 어떻게, 무엇을 구덩이에 단계하지 않습니다 있는지 모른다. 코멘트 섹션에서 저와 함께 공유에 오신 것을 환영합니다. 오늘은 여기에 대해 얘기하는, 당신이 우리를 염려 계속 할 수 있기를 바랍니다.

참고 문헌
침해, 수정 또는 삭제에 문의하시기 바랍니다 경우, 준비 과정 또는 다음 문서의 일부를 참조하여 본원에 인용했다.
https://www.cnblogs.com/edisonchou/p/exceptionless_deployment_on_production_env_introduction.html
https://www.cnblogs.com/ants/p/8580890.html

추천

출처www.cnblogs.com/markjiang7m2/p/11100563.html