Serilog.Settings.Configuration 8.0.2

Prefix Reserved
dotnet add package Serilog.Settings.Configuration --version 8.0.2                
NuGet\Install-Package Serilog.Settings.Configuration -Version 8.0.2                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.2" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Serilog.Settings.Configuration --version 8.0.2                
#r "nuget: Serilog.Settings.Configuration, 8.0.2"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Serilog.Settings.Configuration as a Cake Addin
#addin nuget:?package=Serilog.Settings.Configuration&version=8.0.2

// Install Serilog.Settings.Configuration as a Cake Tool
#tool nuget:?package=Serilog.Settings.Configuration&version=8.0.2                

Serilog.Settings.Configuration 构建状态 NuGet 版本

一个从Microsoft.Extensions.Configuration源头读取设置的Serilog设置提供程序,包括.NET Core的appsettings.json文件。

默认情况下,配置将从配置文件顶部的Serilog部分读取。

{
  "Serilog": {
    "Using":  [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      { "Name": "Console" },
      { "Name": "File", "Args": { "path": "Logs/log.txt" } }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
    "Destructure": [
      { "Name": "With", "Args": { "policy": "Sample.CustomPolicy, Sample" } },
      { "Name": "ToMaximumDepth", "Args": { "maximumDestructuringDepth": 4 } },
      { "Name": "ToMaximumStringLength", "Args": { "maximumStringLength": 100 } },
      { "Name": "ToMaximumCollectionCount", "Args": { "maximumCollectionCount": 10 } }
    ],
    "Properties": {
        "Application": "Sample"
    }
  }
}

安装此包后,使用ReadFrom.Configuration()并传递一个IConfiguration对象。

static void Main(string[] args)
{
    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", true)
        .Build();

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

    logger.Information("Hello, world!");
}

此示例依赖于以下包:Microsoft.Extensions.Configuration.JsonSerilog.Sinks.ConsoleSerilog.Sinks.FileSerilog.Enrichers.EnvironmentSerilog.Enrichers.Thread,这些包也必须是已安装的。

要查看更复杂的示例,请转到示例文件夹。

语法描述

根部分名

根部分名是可以更改的

{
  "CustomSection": {
    ...
  }
}
var options = new ConfigurationReaderOptions { SectionName = "CustomSection" };
var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration, options)
    .CreateLogger();

使用部分和配置程序集的自动发现

Using部分包含包含配置方法(如WriteTo.File()Enrich.WithThreadId())的assemblies列表。

"Serilog": {
    "Using":  [ "Serilog.Sinks.Console", "Serilog.Enrichers.Thread", /* ... */ ],
    // ...
}

对于.NET Core项目,构建工具生成.deps.json文件,本包利用Microsoft.Extensions.DependencyModel的约定来查找依赖中任何带有Serilog的包名称,并从中提取配置方法,因此示例中的Using部分可以省略。

{
  "Serilog": {
    "MinimumLevel": "Debug",
    "WriteTo": [ "Console" ],
    ...
  }
}

为了利用此约定在用.NET Core CLI工具构建的.NET Framework项目中指定PreserveCompilationContexttrue在csproj属性中

<PropertyGroup Condition=" '$(TargetFramework)' == 'net46' ">
  <PreserveCompilationContext>true</PreserveCompilationContext>
</PropertyGroup>

在非标准依赖管理的情况下,可以传递一个自定义的DependencyContext对象

var functionDependencyContext = DependencyContext.Load(typeof(Startup).Assembly);

var options = new ConfigurationReaderOptions(functionDependencyContext) { SectionName = "AzureFunctionsJobHost:Serilog" };
var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(hostConfig, options)
    .CreateLogger();

或者,也可以传递配置程序集的数组

var configurationAssemblies = new[]
{
    typeof(ConsoleLoggerConfigurationExtensions).Assembly,
    typeof(FileLoggerConfigurationExtensions).Assembly,
};
var options = new ConfigurationReaderOptions(configurationAssemblies);
var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration, options)
    .CreateLogger();

对于传统的.NET Framework项目,它还会扫描默认的探测路径。

对于所有其他情况,以及在非传统配置程序集名称的情况下,务必使用Using部分。

从.NET 5.0开始的单文件应用程序

目前,在捆绑模式下不支持配置程序集的自动发现。务必使用Using部分或显式传递配置程序集的集合作为解决方案。

MinimumLevel、LevelSwitches、覆盖和动态重新加载

MinimumLevel配置属性可以设置为一个单个值,如上面的示例,或者级别可以按日志源覆盖。

这在ASP.NET Core应用程序中很有用,因为这些应用程序通常会指定最小级别。

"MinimumLevel": {
    "Default": "Information",
    "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
    }
}

MinimumLevel部分还尊重底层提供程序支持的动态重新加载。

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile(path: "appsettings.json", reloadOnChange: true)
    .Build();

(注意:仅对现有源尊重动态更新。不支持在Override部分插入新记录。)

您还可以在自定义部分中声明LoggingLevelSwitch并引用它们作为后端参数。

{
    "Serilog": {
        "LevelSwitches": { "controlSwitch": "Verbose" },
        "WriteTo": [
            {
                "Name": "Seq",
                "Args": {
                    "serverUrl": "http://localhost:5341",
                    "apiKey": "yeEZyL3SMcxEKUijBjN",
                    "controlLevelSwitch": "$controlSwitch"
                }
            }
        ]
    }
}

自版本 7.0.0 开始,声明开关(即 Serilog:LevelSwitches 部分)和最低等级覆盖开关(即 Serilog:MinimumLevel:Override 部分)都通过读取器选项上的回调进行暴露,以便保留引用

var allSwitches = new Dictionary<string, LoggingLevelSwitch>();
var options = new ConfigurationReaderOptions
{
    OnLevelSwitchCreated = (switchName, levelSwitch) => allSwitches[switchName] = levelSwitch
};

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

LoggingLevelSwitch controlSwitch = allSwitches["$controlSwitch"];

WriteTo、Enrich、AuditTo、Destructure 部分

这些部分支持简化语法,例如以下内容在没有需要由处理程序传递参数的情况下是有效的

"WriteTo": [ "Console", "DiagnosticTrace" ]

或者,也可以使用上述示例中的长形式("Name":)语法来传递参数。

Microsoft.Extensions.Configuration.Json 惯例,数组语法隐式地为每个元素定义索引,以便为配置键创建唯一的路径。因此,上述示例等同于

"WriteTo": {
    "0": "Console",
    "1": "DiagnosticTrace"
}

并且

"WriteTo:0": "Console",
"WriteTo:1": "DiagnosticTrace"

(键的结果路径将相同,即 Serilog:WriteTo:0Serilog:WriteTo:1

当使用环境变量覆盖设置时,它会变得更加不方便且脆弱,因此你可以指定自定义名称

"WriteTo": {
    "ConsoleSink": "Console",
    "DiagnosticTraceSink": { "Name": "DiagnosticTrace" }
}

属性部分

本部分定义了一个静态键值对列表,它将丰富日志事件。

过滤器部分

本部分定义了将应用于日志事件的过滤器。这在与 Serilog.Expressions(或旧版 Serilog.Filters.Expressions) 包结合使用时特别有用,这样你可以在文本形式中编写表达式

"Filter": [{
  "Name": "ByIncludingOnly",
  "Args": {
      "expression": "Application = 'Sample'"
  }
}]

使用此包,你还可以在自定义部分声明 LoggingFilterSwitch,并将它们引用为过滤器参数

{
    "Serilog": {
        "FilterSwitches": { "filterSwitch": "Application = 'Sample'" },
        "Filter": [
            {
                "Name": "ControlledBy",
                "Args": {
                    "switch": "$filterSwitch"
                }
            }
        ]
}

自版本 7.0.0 开始,过滤器开关通过读取器选项上的回调进行暴露,以便保留引用

var filterSwitches = new Dictionary<string, ILoggingFilterSwitch>();
var options = new ConfigurationReaderOptions
{
    OnFilterSwitchCreated = (switchName, filterSwitch) => filterSwitches[switchName] = filterSwitch
};

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

ILoggingFilterSwitch filterSwitch = filterSwitches["filterSwitch"];

嵌套配置部分

某些 Serilog 包需要引用日志配置对象。本项目中示例程序的以下条目配置了 Serilog.Sinks.Async 包以包装 Serilog.Sinks.File 包。configure 参数引用了 File 处理器配置

"WriteTo:Async": {
  "Name": "Async",
  "Args": {
    "configure": [
      {
        "Name": "File",
        "Args": {
          "path": "%TEMP%/Logs/serilog-configuration-sample.txt",
          "outputTemplate":
              "{Timestamp:o} [{Level:u3}] ({Application}/{MachineName}/{ThreadId}) {Message}{NewLine}{Exception}"
        }
      }
    ]
  }
},

解构

解构意味着从对象中提取信息并创建具有值的属性;Serilog 提供 @ 结构捕获运算符。如果有必要自定义序列化日志事件的样式(例如,隐藏属性值或将它们替换为其他东西),可以定义几个解构策略,如下所示

"Destructure": [
  {
    "Name": "With",
    "Args": {
      "policy": "MyFirstNamespace.FirstDestructuringPolicy, MyFirstAssembly"
    }
  },
  {
    "Name": "With",
    "Args": {
      "policy": "MySecondNamespace.SecondDestructuringPolicy, MySecondAssembly"
    }
  },
   {
    "Name": "With",
    "Args": {
      "policy": "MyThirdNamespace.ThirdDestructuringPolicy, MyThirdAssembly"
    }
  },
],

这是第一个解构策略的示例。

namespace MyFirstNamespace;

public record MyDto(int Id, int Name);

public class FirstDestructuringPolicy : IDestructuringPolicy
{
    public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, 
        [NotNullWhen(true)] out LogEventPropertyValue? result)
    {
        if (value is not MyDto dto)
        {
            result = null;
            return false;
        }

        result = new StructureValue(new List<LogEventProperty>
        {
            new LogEventProperty("Identifier", new ScalarValue(deleteTodoItemInfo.Id)),
            new LogEventProperty("NormalizedName", new ScalarValue(dto.Name.ToUpperInvariant()))
        });

        return true;
    }
}

假设 Serilog 需要在处理日志事件时对 MyDto 类型的参数进行解构

logger.Information("About to process input: {@MyDto} ...", myDto);

它将应用 FirstDestructuringPolicy,将 MyDto 实例转换为 StructureValue 实例;Serilog 控制台处理程序将写入以下条目

About to process input: {"Identifier": 191, "NormalizedName": "SOME_UPPER_CASE_NAME"} ...

参数绑定

当配置指定了参数的离散值(如字符串字面值)时,包尝试将该值转换为目标方法声明的参数 CLR 类型。对于将字符串解析为 UriTimeSpan枚举、数组和自定义集合,还提供了额外的显式处理。

自版本 7.0.0 开始,只要使用 ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions options) 方法,转换将使用不变文化(CultureInfo.InvariantCulture)。已弃用的方法使用当前文化以保持后向兼容性。

静态成员支持

静态成员访问可以通过特殊语法传递给配置参数

{
  "Args": {
     "encoding": "System.Text.Encoding::UTF8",
     "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console"
  }
}

复杂参数值绑定

如果参数值不是离散值,它会尝试为参数找到一个最佳匹配的公共构造函数

{
  "Name": "Console",
  "Args": {
    "formatter": {
      // `type` (or $type) is optional, must be specified for abstract declared parameter types
      "type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions",
      "template": "[{@t:HH:mm:ss} {@l:u3} {Coalesce(SourceContext, '<none>')}] {@m}\n{@x}"
      }
  }
}

对于其他情况,该包将使用Microsoft.Extensions.Options.ConfigurationExtensions提供的配置绑定系统来尝试填充参数。几乎所有可以通过IConfiguration.Get<T>进行绑定的内容都应该可以与这个包一起使用。一个例子是用于配置.NET Standard版本的Serilog.Sinks.MSSqlServer包的可选List<Column>参数。

抽象参数类型

如果参数类型是一个接口或抽象类,则需要指定实现该抽象类型的完整类型名。实现类型应该有参数无构造函数。

"Destructure": [
    { "Name": "With", "Args": { "policy": "Sample.CustomPolicy, Sample" } },
    ...
],

IConfiguration参数

如果Serilog包需要额外的外部配置信息(例如,访问ConnectionStrings部分,该部分位于Serilog部分之外),则应在配置扩展方法中使用一个IConfiguration参数。这个包将自动填充这个参数。不应该在配置源中的参数列表中声明。

IConfigurationSection参数

某些Serilog包可能需要配置信息,这些信息难以用离散值或直接绑定友好的表示来表示。一个例子可能是从默认值集合中删除值的值的列表。在这种情况下,方法可以接受整个IConfigurationSection作为调用参数,并且这个包将会识别并填充这个参数。通过这种方式,Serilog包可以支持任意复杂的配置场景。

示例

Azure Functions(v2,v3)

hosts.json

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingExcludedTypes": "Request",
      "samplingSettings": {
        "isEnabled": true
      }
    }
  },
  "Serilog": {
    "MinimumLevel": {
        "Default": "Information",
        "Override": {
            "Microsoft": "Warning",
            "System": "Warning"
        }
    },
    "Enrich": [ "FromLogContext" ],
    "WriteTo": [
      { "Name": "Seq", "Args": { "serverUrl": "http://localhost:5341" } }
    ]
  }
}

Startup.cs部分名称应以前缀AzureFunctionsJobHost开头

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddSingleton<ILoggerProvider>(sp =>
        {
            var functionDependencyContext = DependencyContext.Load(typeof(Startup).Assembly);

            var hostConfig = sp.GetRequiredService<IConfiguration>();
            var options = new ConfigurationReaderOptions(functionDependencyContext) { SectionName = "AzureFunctionsJobHost:Serilog" };
            var logger = new LoggerConfiguration()
                .ReadFrom.Configuration(hostConfig, options)
                .CreateLogger();

            return new SerilogLoggerProvider(logger, dispose: true);
        });
    }
}

为了使配置程序集自动发现工作,修改Function的csproj文件

<Project Sdk="Microsoft.NET.Sdk">

  

  
  <Target Name="FunctionsPostBuildDepsCopy" AfterTargets="PostBuildEvent">
    <Copy SourceFiles="$(OutDir)$(AssemblyName).deps.json" DestinationFiles="$(OutDir)bin\$(AssemblyName).deps.json" />
  </Target>

  <Target Name="FunctionsPublishDepsCopy" AfterTargets="Publish">
    <Copy SourceFiles="$(OutDir)$(AssemblyName).deps.json" DestinationFiles="$(PublishDir)bin\$(AssemblyName).deps.json" />
  </Target>

</Project>

版本控制

这个包跟踪其Microsoft.Extensions.Configuration依赖的版本和目标框架支持。

产品 兼容的和额外的目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 兼容。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 兼容。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework 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 Standard的信息。

NuGet 包 (677)

显示依赖于 Serilog.Settings.Configuration 的前 5 个 NuGet 包

下载
Serilog.AspNetCore

Serilog 对 ASP.NET Core 记录的支持

Umbraco.Cms.Infrastructure

包含运行 Umbraco CMS 所需的基础设施程序集。

IppDotNetSdkForQuickBooksApiV3

IPP .NET SDK for QuickBooks V3 是一组 .NET 类,使调用 QuickBooks API 更容易。这是 .Net Standard 2.0 版本的 .Net SDK

NET6CustomLibrary

开源自定义 dotnet 扩展库

Sitko.Core.App

Sitko.Core 是一套库,旨在帮助快速构建 .NET Core 应用程序

GitHub 代码仓库 (136)

显示依赖于 Serilog.Settings.Configuration 的前 5 个最受欢迎的 GitHub 代码仓库

代码仓库 Star 数
jellyfin/jellyfin
免费的软件媒体系统
microsoft/ailab
使用微软 AI 体验、学习和编码最新的突破性创新
RayWangQvQ/BiliBiliToolPro
B 站(bilibili)自动任务工具,支持 docker、青龙、k8s 等多种部署方式。敏感肌也能用。
Kareadita/Kavita
Kavita 是一个快速、功能丰富的跨平台阅读服务器。旨在成为满足您所有阅读需求的全解决方案。设置自己的服务器并与您的朋友和家人共享您的阅读收藏。
EventStore/EventStore
EventStoreDB,事件原生数据库。专为事件源、事件驱动和微服务架构设计
版本 下载 最后更新
8.0.2 906,674 7/11/2024
8.0.2-dev-00598 78 8/6/2024
8.0.2-dev-00592 93 7/11/2024
8.0.2-dev-00591 106 7/11/2024
8.0.1 1,355,623 6/6/2024
8.0.1-dev-00583 7,002 5/13/2024
8.0.1-dev-00582 42,025 3/21/2024
8.0.1-dev-00575 15,504 2/26/2024
8.0.1-dev-00572 9,350 2/19/2024
8.0.1-dev-00571 237 2/19/2024
8.0.1-dev-00561 127,470 11/15/2023
8.0.0 28,639,459 11/15/2023
8.0.0-dev-00556 468 11/15/2023
8.0.0-dev-00555 441 11/15/2023
8.0.0-dev-00550 646 11/13/2023
7.0.2-dev-00546 47,706 8/30/2023
7.0.1 6,326,897 8/23/2023
7.0.1-dev-00540 743 8/21/2023
7.0.0 24,449,992 5/10/2023
7.0.0-dev-00538 660 8/5/2023
7.0.0-dev-00535 665 7/5/2023
7.0.0-dev-00529 1,236 5/10/2023
7.0.0-dev-00527 1,276 5/9/2023
7.0.0-dev-00525 797 5/8/2023
7.0.0-dev-00521 653 5/8/2023
7.0.0-dev-00519 618 5/8/2023
7.0.0-dev-00513 1,011 5/5/2023
7.0.0-dev-00508 4,515 5/5/2023
7.0.0-dev-00504 679 5/5/2023
4.0.0-dev-00499 16,381 4/21/2023
4.0.0-dev-00486 29,212 3/21/2023
4.0.0-dev-00484 651 3/21/2023
4.0.0-dev-00482 729 3/21/2023
4.0.0-dev-00473 4,232 3/16/2023
4.0.0-dev-00456 13,567 3/15/2023
4.0.0-dev-00452 650 3/14/2023
4.0.0-dev-00448 1,863 3/13/2023
4.0.0-dev-00443 670 3/13/2023
4.0.0-dev-00440 1,029 3/12/2023
4.0.0-dev-00417 670 3/12/2023
4.0.0-dev-00413 654 3/12/2023
4.0.0-dev-00411 758 3/11/2023
4.0.0-dev-00408 650 3/11/2023
4.0.0-dev-00401 631 3/11/2023
4.0.0-dev-00395 647 3/10/2023
4.0.0-dev-00389 867 3/10/2023
4.0.0-dev-00385 839 3/9/2023
3.5.0-dev-00383 6,938 3/9/2023
3.5.0-dev-00370 126,766 1/6/2023
3.5.0-dev-00367 22,218 12/19/2022
3.5.0-dev-00359 133,932 10/18/2022
3.5.0-dev-00357 4,196 10/13/2022
3.5.0-dev-00355 26,321 9/14/2022
3.5.0-dev-00353 753 9/13/2022
3.5.0-dev-00352 794 9/13/2022
3.4.0 35,171,941 9/13/2022
3.3.1-dev-00337 168,677 5/13/2022
3.3.1-dev-00335 806 5/12/2022
3.3.1-dev-00327 1,342 5/11/2022
3.3.1-dev-00323 736 5/11/2022
3.3.1-dev-00313 15,812 4/14/2022
3.3.1-dev-00296 144,882 1/8/2022
3.3.0 123,620,975 10/7/2021
3.3.0-dev-00291 151,770 8/31/2021
3.2.1-dev-00288 26,004 8/13/2021
3.2.0 7,445,497 8/11/2021
3.2.0-dev-00283 809 8/11/2021
3.2.0-dev-00281 747 8/11/2021
3.2.0-dev-00272 101,591 5/7/2021
3.2.0-dev-00269 3,624 5/3/2021
3.2.0-dev-00266 35,855 3/26/2021
3.2.0-dev-00264 172,471 11/24/2020
3.2.0-dev-00261 1,638 11/23/2020
3.2.0-dev-00257 1,884 11/20/2020
3.2.0-dev-00249 33,245 11/6/2020
3.2.0-dev-00244 462,453 5/26/2020
3.2.0-dev-00239 14,661 5/13/2020
3.1.1-dev-00237 14,160 5/13/2020
3.1.1-dev-00234 1,743 5/12/2020
3.1.1-dev-00232 1,345 5/11/2020
3.1.1-dev-00228 1,451 5/10/2020
3.1.1-dev-00224 65,996 3/25/2020
3.1.1-dev-00216 891,645 11/21/2019
3.1.1-dev-00209 468,268 6/3/2019
3.1.0 175,442,802 6/2/2019
3.1.0-dev-00206 1,248 6/2/2019
3.1.0-dev-00204 1,229 6/2/2019
3.1.0-dev-00202 1,199 6/2/2019
3.1.0-dev-00200 1,203 6/2/2019
3.0.2-dev-00198 3,306 5/24/2019
3.0.2-dev-00195 15,036 5/6/2019
3.0.2-dev-00187 92,499 1/7/2019
3.0.2-dev-00186 1,506 1/7/2019
3.0.2-dev-00185 1,320 1/7/2019
3.0.2-dev-00183 1,305 1/7/2019
3.0.2-dev-00171 1,487 1/4/2019
3.0.1 12,812,551 10/17/2018
3.0.1-dev-00163 1,641 10/17/2018
3.0.1-dev-00160 7,587 10/15/2018
3.0.0 714,996 10/7/2018
3.0.0-dev-00149 1,320 10/7/2018
3.0.0-dev-00147 1,333 10/7/2018
3.0.0-dev-00142 1,367 10/6/2018
3.0.0-dev-00139 1,357 10/5/2018
3.0.0-dev-00133 5,248 9/29/2018
3.0.0-dev-00128 3,330 9/22/2018
3.0.0-dev-00125 4,999 9/16/2018
3.0.0-dev-00119 36,092 7/28/2018
3.0.0-dev-00116 7,778 7/18/2018
3.0.0-dev-00113 12,160 7/9/2018
3.0.0-dev-00112 64,385 5/14/2018
3.0.0-dev-00111 2,490 5/9/2018
3.0.0-dev-00108 3,774 4/30/2018
3.0.0-dev-00103 2,687 4/21/2018
3.0.0-dev-00097 4,340 4/11/2018
3.0.0-dev-00093 13,567 4/5/2018
3.0.0-dev-00083 51,114 3/14/2018
2.6.1 10,040,655 3/15/2018
2.6.0 23,471 3/14/2018
2.6.0-dev-00081 9,100 2/13/2018
2.5.1-dev-00078 1,623 2/13/2018
2.5.0 957,651 2/10/2018
2.4.1-dev-00072 4,641 1/30/2018
2.4.1-dev-00070 22,075 12/15/2017
2.4.1-dev-00063 19,747 11/8/2017
2.4.1-dev-00061 28,331 9/7/2017
2.4.0 2,724,165 5/18/2017
2.4.0-dev-00057 6,127 4/12/2017
2.4.0-dev-00055 2,044 4/5/2017
2.3.2-dev-00054 1,577 4/5/2017
2.3.1 113,680 4/5/2017
2.3.1-dev-00049 1,601 4/5/2017
2.3.0 16,287 3/29/2017
2.3.0-dev-00044 4,172 3/10/2017
2.3.0-dev-00042 5,266 1/17/2017
2.2.1-dev-00041 1,571 1/17/2017
2.2.0 282,700 11/6/2016
2.2.0-dev-00035 6,972 9/1/2016
2.1.0 52,121 7/26/2016
2.1.0-dev-00028 2,457 7/6/2016
2.1.0-dev-00026 1,697 7/5/2016
2.0.0 73,753 7/5/2016
2.0.0-rc-8 2,094 5/27/2016
2.0.0-rc-21 1,754 6/20/2016
2.0.0-rc-19 1,657 6/6/2016
2.0.0-rc-17 1,548 6/4/2016
2.0.0-rc-15 1,579 6/1/2016
2.0.0-rc-13 1,613 5/27/2016
2.0.0-beta-6 2,823 3/9/2016
2.0.0-beta-5 1,636 3/4/2016
2.0.0-beta-4 1,668 3/4/2016