Serilog.Sinks.Elasticsearch 10.0.0

dotnet add package Serilog.Sinks.Elasticsearch --version 10.0.0                
NuGet\Install-Package Serilog.Sinks.Elasticsearch -Version 10.0.0                
此命令 intended 用来在内 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的版本 Install-Package
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="10.0.0" />                
对于支持PackageReference的项目,将此 XML 节点复制到项目文件中,以引用包。
paket add Serilog.Sinks.Elasticsearch --version 10.0.0                
#r "nuget: Serilog.Sinks.Elasticsearch, 10.0.0"                
#r 指令可用于 F# Interactive 和 Polyglot 笔记本。将其复制到交互式工具或脚本的源代码中,以引用包。
// Install Serilog.Sinks.Elasticsearch as a Cake Addin
#addin nuget:?package=Serilog.Sinks.Elasticsearch&version=10.0.0

// Install Serilog.Sinks.Elasticsearch as a Cake Tool
#tool nuget:?package=Serilog.Sinks.Elasticsearch&version=10.0.0                

Serilog.Sinks.Elasticsearch Continuous Integration NuGet Badge

此存储库包含两个 nuget 包:Serilog.Sinks.ElasticsearchSerilog.Formatting.Elasticsearch

提醒一下,@elastic 的 .NET 团队创建了自己的新型 Serilog Sink,名为 Elastic.Serilog.Sinks(包名:[Elastic.Serilog.Sinks](https://nuget.net.cn/packages/Elastic.Serilog.Sinks#readme-body-tab),文档:[Elastic.Serilog.Sinks 文档](https://elastic.ac.cn/guide/en/ecs-logging/dotnet/current/serilog-data-shipper.html))。尽管当前的 Sink 仍然可以使用,但建议先查看官方的 Elastic 实现,因为它支持更好且更新更及时。

目录

这个 Sink 是什么

Serilog Elasticsearch Sink 项目是为 Serilog 日志框架设计的 Sink(本质上是一个写程序)。结构化日志事件被写入 Sink,每个 Sink 负责将其写入自己的后端、数据库、存储等。这个 Sink 将数据传输到 Elasticsearch,一个 NoSQL 搜索引擎。它以与 Logstash 类似的方式完成,这使得使用 Kibana 来可视化日志变得容易。

特性

  • 简化配置以将日志事件发布到 Elasticsearch。只需服务器地址即可。
  • 所有属性都存储在 ES 中的字段里。这允许你查询所有相关数据,还可以运行此数据上的分析。
  • 能够自定义存储;指定使用的索引名称、序列化器或与服务器的连接(负载均衡)。
  • 持久模式;在将事件传输到 ES 之前首先在磁盘上存储日志事件,确保即使在连接到你的 ES 集群时出现问题也不会丢失事件。
  • 自动为 ES 中日志事件的最佳使用情况创建正确的映射,或自动上传自己的自定义映射。
  • 从版本 3 开始,兼容 Elasticsearch 2。
  • 6.x 版本支持新的 Elasticsearch.net 6.x 库。
  • 从 8.x 版本开始,支持 Elasticsearch.net 7 版本。
  • 从 9.x 版本开始,支持 Elasticsearch.net 8。默认启用版本检测,在这种情况下,TypeName 在 6、7 和 8 的大版本之间自动处理。不再支持 Elasticsearch 的 2 和 5 版本。此 Sink 的 9.0.0 版本针对 netstandard2.0,因此可以在支持它的任何 .NET Framework 中运行(包括 .NET Core 和 .NET Framework),但我们专注于使用 .NET 6.0 进行测试,以便简化维护。

快速入门

Elasticsearch Sink

Install-Package serilog.sinks.elasticsearch

使用默认配置注册此 Sink 简单易懂

var loggerConfig = new LoggerConfiguration()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("https://127.0.0.1:9200")));

或者,如果你在使用 .NET Core 和 Serilog.Settings.Configuration Nuget 包以及 appsettings.json,则默认配置如下所示

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Elasticsearch" ],
    "MinimumLevel": "Warning",
    "WriteTo": [
      {
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "https://127.0.0.1:9200"
        }
      }
    ]
  }
}

更复杂的配置,使用额外的 Nuget 包(例如 Serilog.Enrichers.Environment)如下所示

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Elasticsearch" ],
    "MinimumLevel": "Warning",
    "WriteTo": [
      {
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "https://127.0.0.1:9200"
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName" ],
    "Properties": {
      "Application": "My app"
    }
  }
}

采用这种方式,Sink 将检测 Elasticsearch 服务器版本(《DetectElasticsearchVersion》默认设置为 true)并正确处理 TypeName 的行为,根据服务器版本 (6.x、7.x 或 8.x)。

禁用 Elasticsearch 服务器版本的检测

或者,可以将 DetectElasticsearchVersion 设置为 false 并手动设置某些选项。在这种情况下,Sink 将假定 Elasticsearch 版本为 7,但选项将因为潜在的版本不兼容而忽略。

例如,你可以配置 Sink 强制注册 v6 索引模板。请注意,AutoRegisterTemplate 选项将不会覆盖现有的模板。

var loggerConfig = new LoggerConfiguration()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("https://127.0.0.1:9200") ){
             DetectElasticsearchVersion = false,
             AutoRegisterTemplate = true,
             AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv6
     });

可配置属性

除了在代码中注册 Sink 之外,还可以使用 appSettings 读取器(从 v2.0.42+ 版本开始)注册,如下所示。

本例展示了在应用程序设置读取器中使用时当前可用的选项。

  <appSettings>
    <add key="serilog:using" value="Serilog.Sinks.Elasticsearch"/>
    <add key="serilog:write-to:Elasticsearch.nodeUris" value="https://127.0.0.1:9200;http://remotehost:9200"/>
    <add key="serilog:write-to:Elasticsearch.indexFormat" value="custom-index-{0:yyyy.MM}"/>
    <add key="serilog:write-to:Elasticsearch.templateName" value="myCustomTemplate"/>
    <add key="serilog:write-to:Elasticsearch.typeName" value="myCustomLogEventType"/>
    <add key="serilog:write-to:Elasticsearch.pipelineName" value="myCustomPipelineName"/>
    <add key="serilog:write-to:Elasticsearch.batchPostingLimit" value="50"/>
    <add key="serilog:write-to:Elasticsearch.batchAction" value="Create"/>
    <add key="serilog:write-to:Elasticsearch.period" value="2"/>
    <add key="serilog:write-to:Elasticsearch.inlineFields" value="true"/>
    <add key="serilog:write-to:Elasticsearch.restrictedToMinimumLevel" value="Warning"/>
    <add key="serilog:write-to:Elasticsearch.bufferBaseFilename" value="C:\Temp\SerilogElasticBuffer"/>
    <add key="serilog:write-to:Elasticsearch.bufferFileSizeLimitBytes" value="5242880"/>
    <add key="serilog:write-to:Elasticsearch.bufferLogShippingInterval" value="5000"/>
    <add key="serilog:write-to:Elasticsearch.bufferRetainedInvalidPayloadsLimitBytes" value="5000"/>
    <add key="serilog:write-to:Elasticsearch.bufferFileCountLimit " value="31"/>
    <add key="serilog:write-to:Elasticsearch.connectionGlobalHeaders" value="Authorization=Bearer SOME-TOKEN;OtherHeader=OTHER-HEADER-VALUE" />
    <add key="serilog:write-to:Elasticsearch.connectionTimeout" value="5" />
    <add key="serilog:write-to:Elasticsearch.emitEventFailure" value="WriteToSelfLog" />
    <add key="serilog:write-to:Elasticsearch.queueSizeLimit" value="100000" />
    <add key="serilog:write-to:Elasticsearch.autoRegisterTemplate" value="true" />
    <add key="serilog:write-to:Elasticsearch.autoRegisterTemplateVersion" value="ESv7" />
    <add key="serilog:write-to:Elasticsearch.detectElasticsearchVersion" value="false" />
    <add key="serilog:write-to:Elasticsearch.overwriteTemplate" value="false" />
    <add key="serilog:write-to:Elasticsearch.registerTemplateFailure" value="IndexAnyway" />
    <add key="serilog:write-to:Elasticsearch.deadLetterIndexName" value="deadletter-{0:yyyy.MM}" />
    <add key="serilog:write-to:Elasticsearch.numberOfShards" value="20" />
    <add key="serilog:write-to:Elasticsearch.numberOfReplicas" value="10" />
    <add key="serilog:write-to:Elasticsearch.formatProvider" value="My.Namespace.MyFormatProvider, My.Assembly.Name" />
    <add key="serilog:write-to:Elasticsearch.connection" value="My.Namespace.MyConnection, My.Assembly.Name" />
    <add key="serilog:write-to:Elasticsearch.serializer" value="My.Namespace.MySerializer, My.Assembly.Name" />
    <add key="serilog:write-to:Elasticsearch.connectionPool" value="My.Namespace.MyConnectionPool, My.Assembly.Name" />
    <add key="serilog:write-to:Elasticsearch.customFormatter" value="My.Namespace.MyCustomFormatter, My.Assembly.Name" />
    <add key="serilog:write-to:Elasticsearch.customDurableFormatter" value="My.Namespace.MyCustomDurableFormatter, My.Assembly.Name" />
    <add key="serilog:write-to:Elasticsearch.failureSink" value="My.Namespace.MyFailureSink, My.Assembly.Name" />
  </appSettings>

使用appSettings配置需要nodeUris属性。可以使用,;将节点隔开来指定多个节点。所有其他属性都是可选的。另外,还需要设置<add key="serilog:using" value="Serilog.Sinks.Elasticsearch"/>来包含该下沉设备。所有其他属性都是可选的。如果您没有显式指定索引格式设置,将自动使用通用索引,如'logstash-[当前日期]'。

然后使用Serilog开始编写事件。

Elasticsearch 格式化器

Install-Package serilog.formatting.elasticsearch

Serilog.Formatting.Elasticsearch NuGet 包包含几个格式化程序。

  • ElasticsearchJsonFormatter - 尊重配置属性名处理的自定义 JSON 格式化程序,并将Timestamp强制转换为 @timestamp。
  • ExceptionAsObjectJsonFormatter - 将任何异常序列化为异常对象的 JSON 格式化程序。

如果可能,可以覆盖默认格式化程序以用作所选的下沉设备

var loggerConfig = new LoggerConfiguration()
  .WriteTo.Console(new ElasticsearchJsonFormatter());

更多信息

有关 Elasticsearch 中字段的说明

请注意,在Elasticsearch索引内部存在显式和隐式类型映射。作为字符串的值X将被作为字符串索引。在下一个日志消息中使用整数X将不起作用。ES将引发映射异常,但您的日志项目因执行批量操作而没有存储这一点并不明显。

因此,在定义和配置您的字段(及其类型)时请小心。很容易错过,您首次将{User}发送为简单的用户名(字符串),然后将其作为User对象发送。索引中创建的第一个映射将获胜。有关详细信息和建议的解决方案,请参阅问题#184。ES对索引中使用动态字段的数量也有限制。

有关 Kibana 的说明

为了避免在具有嵌套异常的异常中使用深度嵌套的JSON结构,默认情况下,已记录的异常及其内部异常以异常数组的格式在exceptions字段中记录。使用'Depth'字段遍历内部异常流程。

但是,并非Kibana中的所有功能都适用于JSON数组 - 例如,在仪表板和可视化中包含异常字段。因此,我们提供了一个替代格式化程序,即ExceptionAsObjectJsonFormatter,它将异常序列化到具有嵌套InnerException属性的exception字段中作为对象。这是下沉设备版本2之前的默认行为。

使用它时,只需在创建下沉设备时指定它作为CustomFormatter即可

    new ElasticsearchSink(new ElasticsearchSinkOptions(url)
    {
      CustomFormatter = new ExceptionAsObjectJsonFormatter(renderMessage:true)
    });

appsettings.json JSON 配置

要在例如ASP.NET Core或.NET Core中使用Microsoft.Extensions.Configuration与Elasticsearch下沉设备,请使用Serilog.Settings.Configuration包。首先,如果您还没有这样做,请安装该软件包

Install-Package Serilog.Settings.Configuration

改为直接在代码中配置下沉设备,请调用ReadFrom.Configuration()

var configuration = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json")
    .Build();

var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

在你的 appsettings.json 文件中,在 Serilog 节点下,

{
  "Serilog": {
    "WriteTo": [{
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "https://127.0.0.1:9200;http://remotehost:9200/",
          "indexFormat": "custom-index-{0:yyyy.MM}",
          "templateName": "myCustomTemplate",
          "typeName": "myCustomLogEventType",
          "pipelineName": "myCustomPipelineName",
          "batchPostingLimit": 50,
          "batchAction": "Create",
          "period": 2,
          "inlineFields": true,
          "restrictedToMinimumLevel": "Warning",
          "bufferBaseFilename":  "C:/Temp/docker-elk-serilog-web-buffer",
          "bufferFileSizeLimitBytes": 5242880,
          "bufferLogShippingInterval": 5000,
          "bufferRetainedInvalidPayloadsLimitBytes": 5000,
          "bufferFileCountLimit": 31,
          "connectionGlobalHeaders" :"Authorization=Bearer SOME-TOKEN;OtherHeader=OTHER-HEADER-VALUE",
          "connectionTimeout": 5,
          "emitEventFailure": "WriteToSelfLog",
          "queueSizeLimit": "100000",
          "autoRegisterTemplate": true,
          "autoRegisterTemplateVersion": "ESv2",
          "overwriteTemplate": false,
          "registerTemplateFailure": "IndexAnyway",
          "deadLetterIndexName": "deadletter-{0:yyyy.MM}",
          "numberOfShards": 20,
          "numberOfReplicas": 10,
          "templateCustomSettings": [{ "index.mapping.total_fields.limit": "10000000" } ],
          "formatProvider": "My.Namespace.MyFormatProvider, My.Assembly.Name",
          "connection": "My.Namespace.MyConnection, My.Assembly.Name",
          "serializer": "My.Namespace.MySerializer, My.Assembly.Name",
          "connectionPool": "My.Namespace.MyConnectionPool, My.Assembly.Name",
          "customFormatter": "My.Namespace.MyCustomFormatter, My.Assembly.Name",
          "customDurableFormatter": "My.Namespace.MyCustomDurableFormatter, My.Assembly.Name",
          "failureSink": "My.Namespace.MyFailureSink, My.Assembly.Name"
        }
    }]
  }
}

请参考上述 XML <appSettings> 示例,讨论可用的 Args 选项。

错误处理

从版本 5.5 开始,您可以选择如何处理与 Elasticsearch 相关的问题。由于接收器是分批处理的,可能实际上无法将一个或多个事件存储在 Elasticsearch 存储中。例如,可能是一个映射问题。很难找出这里发生了什么。有一个新的选项叫做 EmitEventFailure,它是一个枚举(标记)并有以下选项

  • WriteToSelfLog,默认选项,将错误写入 SelfLog。
  • WriteToFailureSink,失败的日志事件将被发送到另一个接收器。确保通过设置 FailureSink 选项来配置此接收器。
  • ThrowException,将引发异常。
  • RaiseCallback,当事件无法提交到 Elasticsearch 时,会调用失败回调函数。确保设置 FailureCallback 选项来处理事件。

示例

.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("https://127.0.0.1:9200"))
                {
                    FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate),
                    EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog |
                                       EmitEventFailureHandling.WriteToFailureSink |
                                       EmitEventFailureHandling.RaiseCallback,
                    FailureSink = new FileSink("./failures.txt", new JsonFormatter(), null)
                })

使用 AutoRegisterTemplate 选项时,接收器会将默认模板写入 Elasticsearch。当此模板不存在时,可能不需要索引,因为它可能影响数据质量。从版本 5.5 开始,您可以使用 RegisterTemplateFailure 选项。将其设置为以下选项之一

  • IndexAnyway;默认选项,将事件发送到服务器
  • IndexToDeadletterIndex;使用 deadletterindex 格式,将事件写入死信队列。当您修复模板映射后,可以将数据复制到正确的索引。
  • FailSink;这将简单地通过引发异常来使接收器失败。

从版本 7 开始,如果指定了持久文件,您可以指定因为数据(有效负载)而由 Elasticsearch 拒绝的日志行的操作。

BufferCleanPayload = (failingEvent, statuscode, exception) =>
                    {
                        dynamic e = JObject.Parse(failingEvent);
                        return JsonConvert.SerializeObject(new Dictionary<string, object>()
                        {
                            { "@timestamp",e["@timestamp"]},
                            { "level","Error"},
                            { "message","Error: "+e.message},
                            { "messageTemplate",e.messageTemplate},
                            { "failingStatusCode", statuscode},
                            { "failingException", exception}
                        });
                    },

当指定持久文件时,IndexDecider 未能很好地工作,因此增加了指定 BufferIndexDecider 的选项。日志事件的类型为字符串,即

 BufferIndexDecider = (logEvent, offset) => "log-serilog-" + (new Random().Next(0, 2)),

Option BufferFileCountLimit 添加。将保留的最大日志文件数,包括当前日志文件。如果要保留无限数量,请传递 null。默认值为 31。Option BufferFileSizeLimitBytes 添加。允许特定日期的缓冲日志文件增长的最大大小(以字节为单位)。默认应用 100L * 1024 * 1024

重大变更

版本 9
  • 已取消对 456 的支持,现在正在坚持使用 NETSTANDARD。
  • 已取消对 Opensearch 的支持 - 此软件包(无保证)支持写入最后一个版本中的 Opensearch,更新的 ES 软件包已取消对 Opensearch 的支持。
版本 7
  • Nuget Serilog.Sinks.File 现在使用而非已弃用的 Serilog.Sinks.RollingFile。
  • SingleEventSizePostingLimit 选项从 int 更改为 long?具有默认值 null,不要使用值 0,否则将不会记录任何内容!
版本 6

从版本 6 开始,接收器已升级以与 Elasticsearch 6.0 一起使用,并支持 ES 6 的新模板。

如果您使用 AutoRegisterTemplate 选项,则需要将 AutoRegisterTemplateVersion 选项设置为 ESv6,以生成与 ES 6 破坏性更改兼容的默认模板。

版本 4

从版本 4 开始,接收器已升级以与 Serilog 2.0 一起使用,并支持 .NET Core。

版本 3

从版本 3 开始,接收器支持 Elasticsearch.Net 2 软件包和 Elasticsearch 版本 2。如果您需要 Elasticsearch 1.x 支持,则继续使用接收器的版本 2。该函数

protected virtual ElasticsearchResponse<T> EmitBatchChecked<T>(IEnumerable<LogEvent> events)

现在使用泛型类型。这允许您在使用 Elasticsearch.NET 时映射到 DynamicResponse,或者如果您想使用 NEST,则映射到 BulkResponse。

我们也取消了.NET 4的支持,因为Elasticsearch.NET客户端也不再支持这个框架版本了。如果您需要使用.NET 4,那么您需要坚持使用2.x版本的组件。

第2版

注意,第2版引入了一些破坏性更改。

  • 重载已被缩减为单个Elasticsearch函数,您可以传递一个选项对象。
  • 命名空间和函数名称现在在所有地方都使用Elasticsearch而不是ElasticSearch。
  • Serilog记录的异常现在被序列化到Exceptions属性,该属性是一个数组而不是对象。
  • 内部异常记录在同一个数组中,但具有增加的深度参数。因此,您不需要嵌套对象,而是需要查看此参数以找到异常的深度。
  • 请不要再使用Gist中提供的一次性映射。组件可以自动为您创建正确的映射,但此功能默认禁用。我们建议您使用它。
  • 从2.0.42版本开始,使用AppSettings读取器注册此组件的功能已恢复。您可以传入一个节点(或节点集合),以及可选的索引名称和模板。
产品 兼容和额外计算的目标框架版本。
.NET net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed.
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET 标准化 netstandard2.0 兼容。 netstandard2.1 已计算。
.NET 框架 net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解有关目标框架.NET 标准化的更多信息。

NuGet 包 (374)

显示依赖 Serilog.Sinks.Elasticsearch 的前 5 个 NuGet 包

下载
Apprio.Enablement.Telemetry

包描述

SyncSoft.App.Serilog

SyncSoft Inc. 的应用框架。

MyJetWallet.Sdk.Service

包描述

Convey.Logging

Convey.Logging

Spiel.Shared

包描述

GitHub 仓库 (46)

显示依赖于 Serilog.Sinks.Elasticsearch 的前 5 个最受欢迎的 GitHub 仓库。

仓库 星标
dotnet/tye
Tye 是一个使开发、测试和部署微服务和分布式应用程序更简单的工具。Tye 项目包括一个本地协调器,使开发微服务变得更容易,以及将微服务部署到 Kubernetes 的能力,配置最小。
anjoy8/Blog.Core
💖 ASP.NET Core 8.0 全家桶教程,前后端分离后端接口,vue教程姊妹篇,官方文档:
fullstackhero/dotnet-starter-kit
生产级别的云就绪 .NET 8 开发工具包(Web API + Blazor 客户端),支持多租户,拥有干净/模块化架构,可节省约 200+ 开发小时,所有功能俱全。
aspnetrun/run-aspnetcore-microservices
在 .NET 平台上使用 ASP.NET Web API、Docker、RabbitMQ、MassTransit、Grpc、Yarp API Gateway、PostgreSQL、Redis、SQLite、SqlServer、Marten、Entity Framework Core、CQRS、MediatR、DDD、垂直和清洁架构实施的微服务,同时使用 .NET 8 和 C# 12 的最新功能。
vietnam-devs/coolstore-microservices
基于 Dapr 和 Tye 的全栈 .NET 微服务。
版本 下载 最后更新
10.0.0 1,108,483 3/12/2024 10.0.0 已弃用,因为它不再得到维护。
9.0.3 4,683,517 6/16/2023
9.0.1 836,638 5/10/2023
9.0.0 2,522,466 2/2/2023
9.0.0-rc1 17,610 1/30/2023
9.0.0-beta9 2,587 1/26/2023
9.0.0-beta8 14,511 1/25/2023
9.0.0-beta7 480,419 5/8/2022
9.0.0-beta4 1,124 4/29/2022
9.0.0-beta12 882 1/30/2023
9.0.0-beta11 1,016 1/28/2023
9.0.0-beta10 919 1/26/2023
8.5.0-alpha0003 381,518 9/28/2020
8.4.1 40,706,821 9/28/2020
8.4.0 254,613 9/19/2020
8.2.0 1,991,881 7/14/2020
8.2.0-alpha0018 1,160 9/19/2020
8.2.0-alpha0017 1,116 9/18/2020
8.2.0-alpha0016 1,223 9/16/2020
8.2.0-alpha0015 1,268 9/16/2020
8.2.0-alpha0012 1,202 8/6/2020
8.2.0-alpha0007 1,632 7/9/2020
8.2.0-alpha0001 18,378 5/5/2020
8.1.0 2,923,625 5/5/2020
8.1.0-alpha0017 1,255 5/5/2020
8.1.0-alpha0011 109,857 1/22/2020
8.1.0-alpha0010 2,083 1/21/2020
8.1.0-alpha0009 4,196 1/10/2020
8.1.0-alpha0007 40,444 12/16/2019
8.1.0-alpha0006 8,131 11/26/2019
8.1.0-alpha0005 9,120 11/13/2019
8.1.0-alpha0002 243,659 8/26/2019
8.1.0-alpha0001 25,072 8/20/2019
8.0.1 5,571,205 11/8/2019
8.0.0 2,133,478 7/30/2019
8.0.0-alpha0025 11,550 7/15/2019
7.2.0-alpha0005 10,956 4/15/2019
7.2.0-alpha0004 1,424 4/14/2019
7.2.0-alpha0003 1,784 4/8/2019
7.2.0-alpha0002 6,087 3/17/2019
7.2.0-alpha0001 1,620 3/15/2019
7.1.0 3,456,733 2/17/2019
6.5.0 4,556,916 4/21/2018
6.5.0-unstable0042 1,667 9/26/2018
6.5.0-unstable0041 1,647 9/26/2018
6.5.0-unstable0040 1,783 9/14/2018
6.5.0-unstable0039 1,774 8/20/2018
6.5.0-unstable0038 1,889 5/14/2018
6.5.0-alpha0057 1,499 1/27/2019
6.5.0-alpha0045 1,496 1/26/2019
6.5.0-alpha0043 1,501 12/27/2018
6.3.0 559,416 2/25/2018
6.3.0-unstable0031 1,937 4/21/2018
6.3.0-unstable0025 1,959 4/21/2018
6.3.0-unstable0024 1,932 4/21/2018
6.3.0-unstable0023 1,981 4/21/2018
6.3.0-unstable0022 1,951 4/21/2018
6.3.0-unstable0021 1,872 4/1/2018
6.3.0-unstable0020 1,878 3/1/2018
6.3.0-unstable0019 1,867 2/25/2018
6.1.0 249,551 2/10/2018
6.1.0-unstable0013 3,320 2/1/2018
5.7.0 461,400 1/18/2018
5.7.0-unstable0012 1,848 2/1/2018
5.7.0-unstable0011 1,870 1/23/2018
5.7.0-unstable0010 1,902 1/18/2018
5.5.0 578,531 12/2/2017
5.5.0-unstable0009 1,925 1/18/2018
5.5.0-unstable0008 1,982 1/18/2018
5.5.0-unstable0007 1,862 1/18/2018
5.5.0-unstable0006 1,976 12/27/2017
5.5.0-unstable0005 1,870 12/2/2017
5.5.0-unstable0004 2,096 11/25/2017
5.4.0 489,162 9/28/2017
5.3.0 430,683 6/2/2017
5.3.0-unstable0033 1,833 6/2/2017
5.2.0 2,331 6/2/2017
5.2.0-unstable0004 4,352 5/19/2017
5.2.0-unstable0003 1,867 5/3/2017
5.1.0 99,176 5/3/2017
5.0.0 172,127 2/6/2017
5.0.0-unstable0183 1,788 2/19/2017
5.0.0-unstable0181 1,827 2/6/2017
5.0.0-unstable0172 1,875 2/6/2017
4.2.0 125,923 1/31/2017
4.1.1 149,259 10/4/2016
4.1.1-unstable0171 1,796 1/31/2017
4.1.1-unstable0170 1,803 1/25/2017
4.1.0 90,956 8/8/2016
4.0.142 66,142 7/11/2016
3.0.134 31,273 4/6/2016
3.0.129 7,954 3/7/2016
3.0.126 2,101 3/7/2016
3.0.121 2,162 3/7/2016
3.0.115 2,310 3/7/2016
3.0.98 3,426 3/2/2016
3.0.95 23,128 3/2/2016
2.0.80 38,633 1/4/2016
2.0.70 7,874 11/22/2015
2.0.69 2,397 11/22/2015
2.0.60 17,846 8/20/2015
2.0.59 2,213 8/20/2015
2.0.57 2,490 8/15/2015
2.0.56 2,161 8/15/2015
2.0.52 3,938 7/25/2015
2.0.46 4,833 7/2/2015
2.0.41 3,821 6/15/2015
2.0.37 4,558 5/24/2015
2.0.27 19,480 4/9/2015
2.0.23 3,276 4/5/2015
2.0.22 2,221 4/2/2015
2.0.21 2,529 4/2/2015
2.0.20 2,640 4/1/2015
1.4.196 24,794 2/22/2015
1.4.182 3,183 2/15/2015
1.4.168 3,316 2/8/2015
1.4.155 2,511 2/1/2015
1.4.139 11,078 1/23/2015
1.4.118 2,575 1/13/2015
1.4.113 2,479 1/6/2015
1.4.102 2,865 12/21/2014
1.4.99 2,832 12/18/2014
1.4.97 2,535 12/18/2014
1.4.76 5,686 12/8/2014
1.4.75 2,580 12/7/2014
1.4.39 2,568 11/26/2014
1.4.34 2,495 11/24/2014
1.4.28 2,437 11/24/2014
1.4.27 2,473 11/23/2014
1.4.23 2,573 11/21/2014
1.4.22 2,466 11/21/2014
1.4.21 2,454 11/21/2014
1.4.18 2,983 11/18/2014
1.4.15 2,873 11/4/2014
1.4.14 3,159 10/23/2014
1.4.13 2,428 10/23/2014
1.4.12 2,705 10/12/2014
1.4.11 2,383 10/8/2014
1.4.10 2,577 9/26/2014
1.4.9 2,550 9/17/2014
1.4.8 2,462 9/11/2014
1.4.7 2,495 9/1/2014
1.4.6 2,410 8/31/2014
1.4.5 2,496 8/27/2014
1.4.4 2,385 8/27/2014
1.4.3 2,435 8/25/2014
1.4.2 2,389 8/23/2014
1.4.1 2,415 8/23/2014
1.3.43 2,429 8/4/2014
1.3.42 2,329 7/30/2014
1.3.41 2,338 7/28/2014
1.3.40 2,317 7/26/2014
1.3.39 2,346 7/25/2014
1.3.37 2,294 7/25/2014
1.3.36 2,370 7/20/2014
1.3.35 2,362 7/17/2014
1.3.34 2,414 7/6/2014
1.3.33 2,318 6/30/2014
1.3.30 2,311 6/19/2014
1.3.29 2,323 6/19/2014
1.3.28 2,451 6/19/2014
1.3.27 2,358 6/18/2014
1.3.26 2,299 6/18/2014
1.3.25 2,330 6/9/2014
1.3.24 2,356 5/21/2014
1.3.23 2,350 5/20/2014
1.3.20 2,351 5/18/2014
1.3.19 2,322 5/17/2014
1.3.18 2,493 5/17/2014
1.3.17 2,287 5/17/2014
1.3.16 2,269 5/17/2014
1.3.15 2,264 5/16/2014
1.3.14 2,334 5/16/2014
1.3.13 2,334 5/16/2014
1.3.12 2,269 5/14/2014
1.3.7 2,624 5/11/2014
1.3.6 2,289 5/9/2014
1.3.5 2,357 5/6/2014
1.3.4 2,369 5/4/2014
1.3.3 2,557 4/28/2014
1.3.1 2,361 4/26/2014
1.2.53 2,397 4/26/2014
1.2.52 2,349 4/24/2014
1.2.51 2,517 4/18/2014
1.2.50 2,488 4/18/2014
1.2.49 2,401 4/17/2014
1.2.48 2,579 4/14/2014
1.2.47 2,393 4/14/2014
1.2.45 2,400 4/13/2014
1.2.44 2,540 4/9/2014
1.2.41 2,390 4/7/2014
1.2.40 2,407 4/7/2014
1.2.39 2,520 3/29/2014
1.2.37 2,378 3/29/2014
1.2.29 19,319 3/16/2014