Serilog.Sinks.Elasticsearch 10.0.0 (original) (raw)

This repository contains two nuget packages: Serilog.Sinks.Elasticsearch and Serilog.Formatting.Elasticsearch.

Just a heads up that the .NET team @elastic have created their own new Serilog Sink called Elastic.Serilog.Sinks (Package: https://www.nuget.org/packages/Elastic.Serilog.Sinks#readme-body-tab and documentation: https://www.elastic.co/guide/en/ecs-logging/dotnet/current/serilog-data-shipper.html). Although this current sink will still work, I advise you to have a look first at the official Elastic implementation as it is better supported and more up to date.

Table of contents

What is this sink

The Serilog Elasticsearch sink project is a sink (basically a writer) for the Serilog logging framework. Structured log events are written to sinks and each sink is responsible for writing it to its own backend, database, store etc. This sink delivers the data to Elasticsearch, a NoSQL search engine. It does this in a similar structure as Logstash and makes it easy to use Kibana for visualizing your logs.

Features

Quick start

Elasticsearch sinks

Install-Package serilog.sinks.elasticsearch

Simplest way to register this sink is to use default configuration:

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

Or, if using .NET Core and Serilog.Settings.Configuration Nuget package and appsettings.json, default configuration would look like this:

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

More elaborate configuration, using additional Nuget packages (e.g. Serilog.Enrichers.Environment) would look like:

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

This way the sink will detect version of Elasticsearch server (DetectElasticsearchVersion is set to true by default) and handle TypeName behavior correctly, based on the server version (6.x, 7.x or 8.x).

Disable detection of Elasticsearch server version

Alternatively, DetectElasticsearchVersion can be set to false and certain option can be configured manually. In that case, the sink will assume version 7 of Elasticsearch, but options will be ignored due to a potential version incompatibility.

For example, you can configure the sink to force registeration of v6 index template. Be aware that the AutoRegisterTemplate option will not overwrite an existing template.

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

Configurable properties

Besides a registration of the sink in the code, it is possible to register it using appSettings reader (from v2.0.42+) reader (from v2.0.42+) as shown below.

This example shows the options that are currently available when using the appSettings reader.

  <appSettings>
    <add key="serilog:using" value="Serilog.Sinks.Elasticsearch"/>
    <add key="serilog:write-to:Elasticsearch.nodeUris" value="http://localhost: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>

With the appSettings configuration the nodeUris property is required. Multiple nodes can be specified using , or ; to separate them. All other properties are optional. Also required is the <add key="serilog:using" value="Serilog.Sinks.Elasticsearch"/> setting to include this sink. All other properties are optional. If you do not explicitly specify an indexFormat-setting, a generic index such as 'logstash-[current_date]' will be used automatically.

And start writing your events using Serilog.

Elasticsearch formatters

Install-Package serilog.formatting.elasticsearch

The Serilog.Formatting.Elasticsearch nuget package consists of a several formatters:

Override default formatter if it's possible with selected sink

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

More information

A note about fields inside Elasticsearch

Be aware that there is an explicit and implicit mapping of types inside an Elasticsearch index. A value called X as a string will be indexed as being a string. Sending the same X as an integer in a next log message will not work. ES will raise a mapping exception, however it is not that evident that your log item was not stored due to the bulk actions performed.

So be careful about defining and using your fields (and type of fields). It is easy to miss that you first send a {User} as a simple username (string) and next as a User object. The first mapping dynamically created in the index wins. See also issue #184 for details and a possible solution. There are also limits in ES on the number of dynamic fields you can actually throw inside an index.

A note about Kibana

In order to avoid a potentially deeply nested JSON structure for exceptions with inner exceptions, by default the logged exception and it's inner exception is logged as an array of exceptions in the field exceptions. Use the 'Depth' field to traverse the inner exceptions flow.

However, not all features in Kibana work just as well with JSON arrays - for instance, including exception fields on dashboards and visualizations. Therefore, we provide an alternative formatter, ExceptionAsObjectJsonFormatter, which will serialize the exception into the exception field as an object with nested InnerException properties. This was also the default behavior of the sink before version 2.

To use it, simply specify it as the CustomFormatter when creating the sink:

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

JSON appsettings.json configuration

To use the Elasticsearch sink with Microsoft.Extensions.Configuration, for example with ASP.NET Core or .NET Core, use the Serilog.Settings.Configuration package. First install that package if you have not already done so:

Install-Package Serilog.Settings.Configuration

Instead of configuring the sink directly in code, call ReadFrom.Configuration():

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

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

In your appsettings.json file, under the Serilog node, :

{
  "Serilog": {
    "WriteTo": [{
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "http://localhost: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"
        }
    }]
  }
}

See the XML <appSettings> example above for a discussion of available Args options.

Handling errors

From version 5.5 you have the option to specify how to handle issues with Elasticsearch. Since the sink delivers in a batch, it might be possible that one or more events could actually not be stored in the Elasticsearch store. Can be a mapping issue for example. It is hard to find out what happened here. There is a new option called EmitEventFailure which is an enum (flagged) with the following options:

An example:

.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost: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)
                })

With the AutoRegisterTemplate option the sink will write a default template to Elasticsearch. When this template is not there, you might not want to index as it can influence the data quality. Since version 5.5 you can use the RegisterTemplateFailure option. Set it to one of the following options:

Since version 7 you can specify an action to do when log row was denied by the elasticsearch because of the data (payload) if durable file is specied. i.e.

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}
                        });
                    },

The IndexDecider didnt worked well when durable file was specified so an option to specify BufferIndexDecider is added. Datatype of logEvent is string i.e.

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

Option BufferFileCountLimit is added. The maximum number of log files that will be retained. including the current log file. For unlimited retention, pass null. The default is 31. Option BufferFileSizeLimitBytes is added The maximum size, in bytes, to which the buffer log file for a specific date will be allowed to grow. By default 100L * 1024 * 1024 will be applied.

Breaking changes

Version 9
Version 7
Version 6

Starting from version 6, the sink has been upgraded to work with Elasticsearch 6.0 and has support for the new templates used by ES 6.

If you use the AutoRegisterTemplate option, you need to set the AutoRegisterTemplateVersion option to ESv6 in order to generate default templates that are compatible with the breaking changes in ES 6.

Version 4

Starting from version 4, the sink has been upgraded to work with Serilog 2.0 and has .NET Core support.

Version 3

Starting from version 3, the sink supports the Elasticsearch.Net 2 package and Elasticsearch version 2. If you need Elasticsearch 1.x support, then stick with version 2 of the sink. The function

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

now uses a generic type. This allows you to map to either DynamicResponse when using Elasticsearch.NET or to BulkResponse if you want to use NEST.

We also dropped support for .NET 4 since the Elasticsearch.NET client also does not support this version of the framework anymore. If you need to use .net 4, then you need to stick with the 2.x version of the sink.

Version 2

Be aware that version 2 introduces some breaking changes.

Product Compatible and additional computed target framework versions.
.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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed.
.NET Core netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed.
.NET Standard netstandard2.0 is compatible. netstandard2.1 was computed.
.NET Framework net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed.
MonoAndroid monoandroid was computed.
MonoMac monomac was computed.
MonoTouch monotouch was computed.
Tizen tizen40 was computed. tizen60 was computed.
Xamarin.iOS xamarinios was computed.
Xamarin.Mac xamarinmac was computed.
Xamarin.TVOS xamarintvos was computed.
Xamarin.WatchOS xamarinwatchos was computed.

NuGet packages (416)

Showing the top 5 NuGet packages that depend on Serilog.Sinks.Elasticsearch:

Package Downloads
Apprio.Enablement.Telemetry Package Description 4.0M
SyncSoft.App.Serilog An app framework for SyncSoft Inc. 580.2K
Convey.Logging Convey.Logging 500.0K
MyJetWallet.Sdk.Service Package Description 483.4K
Spiel.Shared Package Description 365.5K

GitHub repositories (44)

Showing the top 20 popular GitHub repositories that depend on Serilog.Sinks.Elasticsearch:

Repository Stars
fullstackhero/dotnet-starter-kit Production Grade Cloud-Ready .NET 9 Starter Kit (Web API + Blazor Client) with Multitenancy Support, and Clean/Modular Architecture that saves roughly 200+ Development Hours! All Batteries Included. 5.7K
dotnet/tye Tye is a tool that makes developing, testing, and deploying microservices and distributed applications easier. Project Tye includes a local orchestrator to make developing microservices easier and the ability to deploy microservices to Kubernetes with minimal configuration. 5.3K
anjoy8/Blog.Core 💖 ASP.NET Core 8.0 全家桶教程,前后端分离后端接口,vue教程姊妹篇,官方文档: 5.2K
vietnam-devs/coolstore-microservices A full-stack .NET microservices build on Dapr and Tye 2.5K
thangchung/clean-architecture-dotnet 🕸 Yet Another .NET Clean Architecture, but for Microservices project. It uses Minimal Clean Architecture with DDD-lite, CQRS-lite, and just enough Cloud-native patterns apply on the simple eCommerce sample and run on Tye with Dapr extension 🍻 1.3K
abpframework/abp-samples Sample solutions built with the ABP Framework 1.3K
meysamhadeli/monolith-to-cloud-architecture A practical architecture styles for migrating from monolith to modern cloud native application with the latest technologies and architectures like Vertical Slice Architecture, Event Sourcing, CQRS, DDD, gRpc, MongoDB, RabbitMq, and Masstransit in .Net 9. 1.2K
xianhc/ape-volo-admin .Net 8 、SqlSugar ORM、Vue 2.X、RBAC。前后端分离的开箱则用的企业级的权限开发框架(中后台管理系统) 1.1K
snatch-dev/Convey A simple recipe for .NET Core microservices. 958
trueai-org/module-shop 一个基于 .NET 8.0 构建的简单、跨平台、模块化的商城系统 919
colinin/abp-next-admin 这是基于vue-vben-admin 模板适用于abp vNext的前端管理项目 916
BehzadDara/SampleProject 789
davidfowl/Micronetes Micronetes is a local orchestrator inspired by kubernetes that makes developing and testing microservices and distributed applications easier. 772
punk-security/smbeagle SMBeagle - Fileshare auditing tool. 716
iayti/CleanArchitecture ASP.NET Core 6 Web API Clean Architecture Solution Template 715
madslundt/NetCoreMicroservicesSample Sample using micro services in .NET Core 3.1 Focusing on clean code 698
jerrytang67/SoMall 社交电商商城开源项目.socail+mall即取名SoMall ,abp netcore 3.1 angular vue uni-app typescript docker mssql 539
fullstackhero/dotnet-microservices-boilerplate The Ultimate Microservices Starter Kit for .NET Developers! 533
damikun/trouble-training FullStack DDD/CQRS with GraphQL workshop including distributed tracing and monitoring. This shows the configuration from React frontend to .Net backend. 474
AntonioFalcaoJr/EventualShop A state-of-the-art distributed system using Reactive DDD as uncertainty modeling, Event Storming as subdomain decomposition, Event Sourcing as an eventual persistence mechanism, CQRS, Async Projections, Microservices for individual deployable units, Event-driven Architecture for efficient integration, and Clean Architecture as domain-centric design 381
Version Downloads Last updated
10.0.0 6,137,526 3/12/2024 10.0.0 is deprecated because it is no longer maintained.
9.0.3 7,579,220 6/16/2023
9.0.1 1,149,272 5/10/2023
9.0.0 3,217,393 2/2/2023
9.0.0-rc1 19,233 1/30/2023
9.0.0-beta9 2,737 1/26/2023
9.0.0-beta8 14,782 1/25/2023
9.0.0-beta7 558,674 5/8/2022
9.0.0-beta4 1,216 4/29/2022
9.0.0-beta12 959 1/30/2023
9.0.0-beta11 1,141 1/28/2023
9.0.0-beta10 995 1/26/2023
8.5.0-alpha0003 408,890 9/28/2020
8.4.1 46,963,233 9/28/2020
8.4.0 269,555 9/19/2020
8.2.0 2,113,867 7/14/2020
8.2.0-alpha0018 1,264 9/19/2020
8.2.0-alpha0017 1,217 9/18/2020
8.2.0-alpha0016 1,325 9/16/2020
8.2.0-alpha0015 1,376 9/16/2020
8.2.0-alpha0012 1,307 8/6/2020
8.2.0-alpha0007 1,746 7/9/2020
8.2.0-alpha0001 20,722 5/5/2020
8.1.0 3,060,070 5/5/2020
8.1.0-alpha0017 1,368 5/5/2020
8.1.0-alpha0011 121,815 1/22/2020
8.1.0-alpha0010 2,190 1/21/2020
8.1.0-alpha0009 4,327 1/10/2020
8.1.0-alpha0007 46,327 12/16/2019
8.1.0-alpha0006 9,232 11/26/2019
8.1.0-alpha0005 9,231 11/13/2019
8.1.0-alpha0002 250,321 8/26/2019
8.1.0-alpha0001 25,193 8/20/2019
8.0.1 6,059,179 11/8/2019
8.0.0 2,254,779 7/30/2019
8.0.0-alpha0025 11,781 7/15/2019
7.2.0-alpha0005 13,402 4/15/2019
7.2.0-alpha0004 1,536 4/14/2019
7.2.0-alpha0003 1,912 4/8/2019
7.2.0-alpha0002 6,218 3/17/2019
7.2.0-alpha0001 1,739 3/15/2019
7.1.0 3,612,865 2/17/2019
6.5.0 4,865,544 4/21/2018
6.5.0-unstable0042 1,826 9/26/2018
6.5.0-unstable0041 1,799 9/26/2018
6.5.0-unstable0040 1,929 9/14/2018
6.5.0-unstable0039 1,916 8/20/2018
6.5.0-unstable0038 2,179 5/14/2018
6.5.0-alpha0057 1,618 1/27/2019
6.5.0-alpha0045 1,622 1/26/2019
6.5.0-alpha0043 1,624 12/27/2018
6.3.0 584,451 2/25/2018
6.3.0-unstable0031 2,228 4/21/2018
6.3.0-unstable0025 2,252 4/21/2018
6.3.0-unstable0024 2,205 4/21/2018
6.3.0-unstable0023 2,253 4/21/2018
6.3.0-unstable0022 2,223 4/21/2018
6.3.0-unstable0021 2,167 4/1/2018
6.3.0-unstable0020 2,177 3/1/2018
6.3.0-unstable0019 2,139 2/25/2018
6.1.0 277,362 2/10/2018
6.1.0-unstable0013 3,607 2/1/2018
5.7.0 644,915 1/18/2018
5.7.0-unstable0012 2,131 2/1/2018
5.7.0-unstable0011 2,157 1/23/2018
5.7.0-unstable0010 2,219 1/18/2018
5.5.0 593,567 12/2/2017
5.5.0-unstable0009 2,218 1/18/2018
5.5.0-unstable0008 2,260 1/18/2018
5.5.0-unstable0007 2,165 1/18/2018
5.5.0-unstable0006 2,276 12/27/2017
5.5.0-unstable0005 2,076 12/2/2017
5.5.0-unstable0004 2,295 11/25/2017
5.4.0 536,151 9/28/2017
5.3.0 439,725 6/2/2017
5.3.0-unstable0033 2,046 6/2/2017
5.2.0 2,564 6/2/2017
5.2.0-unstable0004 4,553 5/19/2017
5.2.0-unstable0003 2,084 5/3/2017
5.1.0 101,861 5/3/2017
5.0.0 179,681 2/6/2017
5.0.0-unstable0183 1,989 2/19/2017
5.0.0-unstable0181 2,046 2/6/2017
5.0.0-unstable0172 2,077 2/6/2017
4.2.0 157,137 1/31/2017
4.1.1 153,367 10/4/2016
4.1.1-unstable0171 2,014 1/31/2017
4.1.1-unstable0170 2,013 1/25/2017
4.1.0 93,394 8/8/2016
4.0.142 69,378 7/11/2016
3.0.134 32,196 4/6/2016
3.0.129 8,342 3/7/2016
3.0.126 2,327 3/7/2016
3.0.121 2,387 3/7/2016
3.0.115 2,541 3/7/2016
3.0.98 3,688 3/2/2016
3.0.95 23,374 3/2/2016
2.0.80 47,303 1/4/2016
2.0.70 8,212 11/22/2015
2.0.69 2,629 11/22/2015
2.0.60 18,995 8/20/2015
2.0.59 2,440 8/20/2015
2.0.57 2,715 8/15/2015
2.0.56 2,410 8/15/2015
2.0.52 4,184 7/25/2015
2.0.46 5,076 7/2/2015
2.0.41 4,099 6/15/2015
2.0.37 4,788 5/24/2015
2.0.27 21,799 4/9/2015
2.0.23 3,503 4/5/2015
2.0.22 2,456 4/2/2015
2.0.21 2,764 4/2/2015
2.0.20 2,881 4/1/2015
1.4.196 25,873 2/22/2015
1.4.182 3,456 2/15/2015
1.4.168 3,547 2/8/2015
1.4.155 2,745 2/1/2015
1.4.139 11,475 1/23/2015
1.4.118 2,803 1/13/2015
1.4.113 2,707 1/6/2015
1.4.102 3,113 12/21/2014
1.4.99 3,072 12/18/2014
1.4.97 2,764 12/18/2014
1.4.76 5,918 12/8/2014
1.4.75 2,809 12/7/2014
1.4.39 2,803 11/26/2014
1.4.34 2,726 11/24/2014
1.4.28 2,675 11/24/2014
1.4.27 2,707 11/23/2014
1.4.23 2,807 11/21/2014
1.4.22 2,696 11/21/2014
1.4.21 2,692 11/21/2014
1.4.18 3,221 11/18/2014
1.4.15 3,094 11/4/2014
1.4.14 3,378 10/23/2014
1.4.13 2,651 10/23/2014
1.4.12 2,946 10/12/2014
1.4.11 2,609 10/8/2014
1.4.10 2,802 9/26/2014
1.4.9 2,773 9/17/2014
1.4.8 2,687 9/11/2014
1.4.7 2,722 9/1/2014
1.4.6 2,631 8/31/2014
1.4.5 2,718 8/27/2014
1.4.4 2,608 8/27/2014
1.4.3 2,662 8/25/2014
1.4.2 2,612 8/23/2014
1.4.1 2,644 8/23/2014
1.3.43 2,656 8/4/2014
1.3.42 2,552 7/30/2014
1.3.41 2,563 7/28/2014
1.3.40 2,541 7/26/2014
1.3.39 2,567 7/25/2014
1.3.37 2,515 7/25/2014
1.3.36 2,593 7/20/2014
1.3.35 2,578 7/17/2014
1.3.34 2,637 7/6/2014
1.3.33 2,542 6/30/2014
1.3.30 2,529 6/19/2014
1.3.29 2,544 6/19/2014
1.3.28 2,680 6/19/2014
1.3.27 2,578 6/18/2014
1.3.26 2,522 6/18/2014
1.3.25 2,557 6/9/2014
1.3.24 2,582 5/21/2014
1.3.23 2,574 5/20/2014
1.3.20 2,573 5/18/2014
1.3.19 2,553 5/17/2014
1.3.18 2,719 5/17/2014
1.3.17 2,512 5/17/2014
1.3.16 2,495 5/17/2014
1.3.15 2,490 5/16/2014
1.3.14 2,559 5/16/2014
1.3.13 2,580 5/16/2014
1.3.12 2,490 5/14/2014
1.3.7 2,855 5/11/2014
1.3.6 2,519 5/9/2014
1.3.5 2,584 5/6/2014
1.3.4 2,594 5/4/2014
1.3.3 2,781 4/28/2014
1.3.1 2,586 4/26/2014
1.2.53 2,622 4/26/2014
1.2.52 2,569 4/24/2014
1.2.51 2,746 4/18/2014
1.2.50 2,729 4/18/2014
1.2.49 2,626 4/17/2014
1.2.48 2,804 4/14/2014
1.2.47 2,626 4/14/2014
1.2.45 2,631 4/13/2014
1.2.44 2,772 4/9/2014
1.2.41 2,621 4/7/2014
1.2.40 2,638 4/7/2014
1.2.39 2,762 3/29/2014
1.2.37 2,608 3/29/2014
1.2.29 37,579 3/16/2014