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
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="10.0.0" />
paket add Serilog.Sinks.Elasticsearch --version 10.0.0
#r "nuget: Serilog.Sinks.Elasticsearch, 10.0.0"
// 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
此存储库包含两个 nuget 包:Serilog.Sinks.Elasticsearch
和 Serilog.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());
更多信息
- 有关如何配置和使用此下沉设备的详细信息的基本信息。
- 可用的配置选项。
- 如何使用耐用性模式。
- 获取NuGet 包。
- 向问题跟踪报告问题。欢迎PR,但请针对dev分支进行
- 查看最近更改的概述,请参阅变更日志。
有关 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 已计算。 |
-
.NETStandard 2.0
- Elasticsearch.Net (>= 7.17.5)
- Serilog (>= 3.1.1)
- Serilog.Formatting.Compact (>= 2.0.0)
- Serilog.Formatting.Elasticsearch (>= 10.0.0)
- Serilog.Sinks.File (>= 5.0.0)
- Serilog.Sinks.PeriodicBatching (>= 4.0.0)
- System.Diagnostics.DiagnosticSource (>= 7.0.2)
-
net6.0
- Elasticsearch.Net (>= 7.17.5)
- Serilog (>= 3.1.1)
- Serilog.Formatting.Compact (>= 2.0.0)
- Serilog.Formatting.Elasticsearch (>= 10.0.0)
- Serilog.Sinks.File (>= 5.0.0)
- Serilog.Sinks.PeriodicBatching (>= 4.0.0)
- System.Diagnostics.DiagnosticSource (>= 7.0.2)
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 | |
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 |