Serilog.Sinks.Elasticsearch 10.0.0

Serilog.Sinks.Elasticsearch Continuous Integration NuGet Badge

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

  • Simple configuration to get log events published to Elasticsearch. Only server address is needed.
  • All properties are stored inside fields in ES. This allows you to query on all the relevant data but also run analytics over this data.
  • Be able to customize the store; specify the index name being used, the serializer or the connections to the server (load balanced).
  • Durable mode; store the logevents first on disk before delivering them to ES making sure you never miss events if you have trouble connecting to your ES cluster.
  • Automatically create the right mappings for the best usage of the log events in ES or automatically upload your own custom mapping.
  • Starting from version 3, compatible with Elasticsearch 2.
  • Version 6.x supports the new Elasticsearch.net version 6.x library.
  • From version 8.x there is support for Elasticsearch.net version 7.
  • From version 9.x there is support for Elasticsearch.net version 8. Version detection is enabled by default, in which case TypeName is handled automatically across major versions 6, 7 and 8. Versions 2 and 5 of Elasticsearch are no longer supported. Version 9.0.0 of the sink targets netstandard2.0 and therefore can be run on any .NET Framework that supports it (both .NET Core and .NET Framework), however, we are focused on testing it with .NET 6.0 to make the maintenance simpler.

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"/><!-- "Index" is default -->
    <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" /><!-- `true` is default -->
    <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:

  • ElasticsearchJsonFormatter - custom json formatter that respects the configured property name handling and forces Timestamp to @timestamp.
  • ExceptionAsObjectJsonFormatter - a json formatter which serializes any exception into an exception object.

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 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:

  • WriteToSelfLog, the default option in which the errors are written to the SelfLog.
  • WriteToFailureSink, the failed events are send to another sink. Make sure to configure this one by setting the FailureSink option.
  • ThrowException, in which an exception is raised.
  • RaiseCallback, the failure callback function will be called when the event cannot be submitted to Elasticsearch. Make sure to set the FailureCallback option to handle the event.

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:

  • IndexAnyway; the default option, the events will be send to the server
  • IndexToDeadletterIndex; using the deadletterindex format, it will write the events to the deadletter queue. When you fix your template mapping, you can copy your data into the right index.
  • FailSink; this will simply fail the sink by raising an exception.

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

  • Dropped support for 456 and sticking now with NETSTANDARD
  • Dropped support for Opensearch - This package supported writing to Opensearch (without guarantees) up untill the last version, Updated ES packages dropped support for Opensearch

Version 7

  • Nuget Serilog.Sinks.File is now used instead of deprecated Serilog.Sinks.RollingFile
  • SingleEventSizePostingLimit option is changed from int to long? with default value null, Don't use value 0 nothing will be logged then!!!!!

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.

  • The overloads have been reduced to a single Elasticsearch function in which you can pass an options object.
  • The namespace and function names are now Elasticsearch instead of ElasticSearch everywhere
  • The Exceptions recorded by Serilog are customer serialized into the Exceptions property which is an array instead of an object.
  • Inner exceptions are recorded in the same array but have an increasing depth parameter. So instead of nesting objects you need to look at this parameter to find the depth of the exception.
  • Do no longer use the mapping once provided in the Gist. The Sink can automatically create the right mapping for you, but this feature is disabled by default. We advice you to use it.
  • Since version 2.0.42 the ability to register this sink using the AppSettings reader is restored. You can pass in a node (or collection of nodes) and optionally an indexname and template.

Showing the top 20 packages that depend on Serilog.Sinks.Elasticsearch.

Packages Downloads
Dis.Common.Logging
Package Description
91
Dis.Common.Logging
Package Description
2,159
Dis.Common.Logging
Package Description
6,730
TNE.Common
Package Description
10,161

https://github.com/serilog-contrib/serilog-sinks-elasticsearch/blob/master/CHANGES.md

Version Downloads Last updated
10.0.0 19 03/15/2024
9.0.3 55 06/18/2023
9.0.2 14 03/21/2024
9.0.1 27 06/25/2023
9.0.0 32 04/06/2023
9.0.0-rc1 25 04/10/2023
9.0.0-beta9 17 04/10/2023
9.0.0-beta8 28 04/10/2023
9.0.0-beta7 3,184 08/11/2022
9.0.0-beta4 36 10/15/2022
9.0.0-beta12 26 04/10/2023
9.0.0-beta11 50 04/10/2023
9.0.0-beta10 43 04/10/2023
8.5.0-alpha0003 46 10/15/2022
8.4.1 25,019 06/27/2022
8.4.0 43 09/24/2022
8.2.0 32 09/21/2022
8.2.0-alpha0018 37 09/21/2022
8.2.0-alpha0017 88 09/23/2022
8.2.0-alpha0016 23 08/08/2022
8.2.0-alpha0015 30 09/23/2022
8.2.0-alpha0012 22 09/21/2022
8.2.0-alpha0007 22 09/24/2022
8.2.0-alpha0001 70 10/15/2022
8.1.0 1,876 06/27/2022
8.1.0-alpha0017 25 09/23/2022
8.1.0-alpha0011 35 09/21/2022
8.1.0-alpha0010 38 09/22/2022
8.1.0-alpha0009 31 09/24/2022
8.1.0-alpha0007 39 10/15/2022
8.1.0-alpha0006 53 09/21/2022
8.1.0-alpha0005 23 10/15/2022
8.1.0-alpha0002 59 09/21/2022
8.1.0-alpha0001 18 10/15/2022
8.0.1 27 09/21/2022
8.0.0 62 09/21/2022
8.0.0-alpha0025 45 09/22/2022
7.2.0-alpha0005 18 09/22/2022
7.2.0-alpha0004 26 09/21/2022
7.2.0-alpha0003 43 09/23/2022
7.2.0-alpha0002 75 07/28/2022
7.2.0-alpha0001 33 10/15/2022
7.1.0 28 10/15/2022
6.5.0 21 10/15/2022
6.5.0-unstable0042 32 09/21/2022
6.5.0-unstable0041 53 09/25/2022
6.5.0-unstable0040 72 09/22/2022
6.5.0-unstable0039 37 09/23/2022
6.5.0-unstable0038 26 09/23/2022
6.5.0-alpha0057 36 09/21/2022
6.5.0-alpha0045 42 09/24/2022
6.5.0-alpha0043 30 09/25/2022
6.3.0 33 06/30/2022
6.3.0-unstable0031 24 09/21/2022
6.3.0-unstable0025 32 09/21/2022
6.3.0-unstable0024 52 10/15/2022
6.3.0-unstable0023 56 09/21/2022
6.3.0-unstable0022 21 09/21/2022
6.3.0-unstable0021 50 09/22/2022
6.3.0-unstable0020 106 09/25/2022
6.3.0-unstable0019 32 09/24/2022
6.1.0 32 10/15/2022
6.1.0-unstable0013 24 09/21/2022
5.7.0 12 09/23/2022
5.7.0-unstable0012 55 09/21/2022
5.7.0-unstable0011 78 09/21/2022
5.7.0-unstable0010 37 09/07/2022
5.5.0 18 09/23/2022
5.5.0-unstable0009 43 09/21/2022
5.5.0-unstable0008 29 09/24/2022
5.5.0-unstable0007 30 10/16/2022
5.5.0-unstable0006 79 09/21/2022
5.5.0-unstable0005 27 09/21/2022
5.5.0-unstable0004 31 09/22/2022
5.4.0 32 10/16/2022
5.3.0 44 09/22/2022
5.3.0-unstable0033 48 09/24/2022
5.2.0 34 09/22/2022
5.2.0-unstable0004 30 10/16/2022
5.2.0-unstable0003 39 09/23/2022
5.1.0 95 09/21/2022
5.0.0 27 09/22/2022
5.0.0-unstable0183 35 09/25/2022
5.0.0-unstable0181 36 09/21/2022
5.0.0-unstable0172 38 09/22/2022
4.2.0 45 09/21/2022
4.1.1 31 10/16/2022
4.1.1-unstable0171 32 09/23/2022
4.1.1-unstable0170 92 07/09/2022
4.1.0 28 09/24/2022
4.0.142 60 09/23/2022
3.0.134 27 09/22/2022
3.0.129 38 09/21/2022
3.0.126 17 09/24/2022
3.0.121 78 09/24/2022
3.0.115 35 10/16/2022
3.0.98 29 10/16/2022
3.0.95 36 10/16/2022
2.0.80 38 09/23/2022
2.0.70 41 09/21/2022
2.0.69 21 09/21/2022
2.0.60 54 09/22/2022
2.0.59 24 09/27/2022
2.0.57 27 09/21/2022
2.0.56 29 09/23/2022
2.0.52 27 09/22/2022
2.0.46 21 09/25/2022
2.0.41 41 09/24/2022
2.0.37 15 09/23/2022
2.0.27 58 10/16/2022
2.0.23 72 09/21/2022
2.0.22 39 09/22/2022
2.0.21 38 10/16/2022
2.0.20 54 09/21/2022
1.4.196 10 09/25/2022
1.4.182 38 09/22/2022
1.4.168 40 09/21/2022
1.4.155 57 09/21/2022
1.4.139 97 09/22/2022
1.4.118 67 09/23/2022
1.4.113 43 09/24/2022
1.4.102 25 09/23/2022
1.4.99 27 09/25/2022
1.4.97 38 09/26/2022
1.4.76 38 09/22/2022
1.4.75 105 07/01/2022
1.4.39 29 09/23/2022
1.4.34 54 09/21/2022
1.4.28 75 09/24/2022
1.4.27 42 09/24/2022
1.4.23 57 09/23/2022
1.4.22 21 09/21/2022
1.4.21 67 09/22/2022
1.4.18 26 09/21/2022
1.4.15 0 11/04/2014
1.4.14 0 10/23/2014
1.4.13 0 10/23/2014
1.4.12 0 10/12/2014
1.4.11 0 10/08/2014
1.4.10 0 09/26/2014
1.4.9 0 09/17/2014
1.4.8 0 09/11/2014
1.4.7 0 09/01/2014
1.4.6 0 08/31/2014
1.4.5 0 08/27/2014
1.4.4 0 08/27/2014
1.4.3 0 08/25/2014
1.4.2 0 08/23/2014
1.4.1 0 08/23/2014
1.3.43 0 08/04/2014
1.3.42 0 07/30/2014
1.3.41 0 07/28/2014
1.3.40 0 07/26/2014
1.3.39 0 07/25/2014
1.3.37 0 07/25/2014
1.3.36 0 07/20/2014
1.3.35 0 07/17/2014
1.3.34 0 07/06/2014
1.3.33 0 06/30/2014
1.3.30 0 06/19/2014
1.3.29 0 06/19/2014
1.3.28 0 06/19/2014
1.3.27 0 06/18/2014
1.3.26 0 06/18/2014
1.3.25 0 06/09/2014
1.3.24 0 05/21/2014
1.3.23 0 05/20/2014
1.3.20 0 05/18/2014
1.3.19 0 05/17/2014
1.3.18 0 05/17/2014
1.3.17 0 05/17/2014
1.3.16 0 05/17/2014
1.3.15 0 05/16/2014
1.3.14 0 05/16/2014
1.3.13 0 05/16/2014
1.3.12 0 05/14/2014
1.3.7 0 05/11/2014
1.3.6 0 05/09/2014
1.3.5 0 05/06/2014
1.3.4 0 05/04/2014
1.3.3 0 04/28/2014
1.3.1 0 04/26/2014
1.2.53 0 04/26/2014
1.2.52 0 04/24/2014
1.2.51 0 04/18/2014
1.2.50 0 04/18/2014
1.2.49 0 04/17/2014
1.2.48 0 04/14/2014
1.2.47 0 04/14/2014
1.2.45 0 04/13/2014
1.2.44 0 04/09/2014
1.2.41 0 04/07/2014
1.2.40 0 04/07/2014
1.2.39 0 03/29/2014
1.2.37 0 03/29/2014
1.2.29 0 03/16/2014