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
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.2" />
paket add Serilog.Settings.Configuration --version 8.0.2
#r "nuget: Serilog.Settings.Configuration, 8.0.2"
// 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
一个从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.Json、Serilog.Sinks.Console、Serilog.Sinks.File、Serilog.Enrichers.Environment和Serilog.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项目中指定PreserveCompilationContext
为true
在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:0
和 Serilog: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 类型。对于将字符串解析为 Uri
、TimeSpan
、枚举
、数组和自定义集合,还提供了额外的显式处理。
自版本 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 已计算。 |
-
.NETFramework 4.6.2
- Microsoft.Extensions.Configuration.Binder (>= 8.0.0)
- Microsoft.Extensions.DependencyModel (>= 8.0.1)
- Serilog (>= 3.1.1)
-
.NETStandard 2.0
- Microsoft.Extensions.Configuration.Binder (>= 8.0.0)
- Microsoft.Extensions.DependencyModel (>= 8.0.1)
- Serilog (>= 3.1.1)
-
net6.0
- Microsoft.Extensions.Configuration.Binder (>= 8.0.0)
- Microsoft.Extensions.DependencyModel (>= 8.0.1)
- Serilog (>= 3.1.1)
-
net7.0
- Microsoft.Extensions.Configuration.Binder (>= 8.0.0)
- Microsoft.Extensions.DependencyModel (>= 8.0.1)
- Serilog (>= 3.1.1)
-
net8.0
- Microsoft.Extensions.Configuration.Binder (>= 8.0.0)
- Microsoft.Extensions.DependencyModel (>= 8.0.1)
- Serilog (>= 3.1.1)
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 |