From 5b679131632386611e363528c3f66fd712dc24ea Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Sun, 2 Jun 2019 10:57:40 +1000 Subject: [PATCH 1/5] Dev version bump [skip ci] --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index e62947a..22d6aea 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -2,7 +2,7 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. - 3.1.0 + 3.1.1 Serilog Contributors netstandard2.0;net451;net461 true From 352cd859e753c6caa6bc0b66e3401f4b2ac5406b Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Tue, 4 Jun 2019 07:13:00 +1000 Subject: [PATCH 2/5] Clarify role of Microsoft.Extensions.Configuration.Json; resolves #181 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 26d133b..b9fe76b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Serilog.Settings.Configuration [![Build status](https://ci.appveyor.com/api/projects/status/r2bgfimd9ocr61px/branch/master?svg=true)](https://ci.appveyor.com/project/serilog/serilog-settings-configuration/branch/master) [![NuGet Version](http://img.shields.io/nuget/v/Serilog.Settings.Configuration.svg?style=flat)](https://www.nuget.org/packages/Serilog.Settings.Configuration/) -A Serilog settings provider that reads from _Microsoft.Extensions.Configuration_, .NET Core's `appsettings.json` file. +A Serilog settings provider that reads from _Microsoft.Extensions.Configuration_ sources, including .NET Core's `appsettings.json` file. Configuration is read from the `Serilog` section. @@ -21,13 +21,13 @@ Configuration is read from the `Serilog` section. { "Name": "ToMaximumCollectionCount", "Args": { "maximumCollectionCount": 10 } } ], "Properties": { - "Application": "Sample" + "Application": "Sample" } } } ``` -This example relies on the _Serilog.Sinks.Console_, _Serilog.Sinks.File_, _Serilog.Enrichers.Environment_, _Serilog.Settings.Configuration_ and _Serilog.Enrichers.Thread_ packages also being installed. +This example relies on the _Microsoft.Extensions.Configuration.Json_, _Serilog.Sinks.Console_, _Serilog.Sinks.File_, _Serilog.Enrichers.Environment_, _Serilog.Settings.Configuration_ and _Serilog.Enrichers.Thread_ packages also being installed. After installing this package, use `ReadFrom.Configuration()` and pass an `IConfiguration` object. From a0c5f458a9d351b1f9ec4ccc404245b3bccf6394 Mon Sep 17 00:00:00 2001 From: Nicholas Blumhardt Date: Mon, 24 Jun 2019 19:09:11 +1000 Subject: [PATCH 3/5] Wrap a (scrolly) long line [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9fe76b..cc443b4 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,8 @@ Some Serilog packages require a reference to a logger configuration object. The "Name": "File", "Args": { "path": "%TEMP%\\Logs\\serilog-configuration-sample.txt", - "outputTemplate": "{Timestamp:o} [{Level:u3}] ({Application}/{MachineName}/{ThreadId}) {Message}{NewLine}{Exception}" + "outputTemplate": + "{Timestamp:o} [{Level:u3}] ({Application}/{MachineName}/{ThreadId}) {Message}{NewLine}{Exception}" } } ] From 50fd5a97c85cda614f2e0550b0675fbff1e0cfee Mon Sep 17 00:00:00 2001 From: Ivan Maximov Date: Tue, 19 Nov 2019 17:31:28 +0300 Subject: [PATCH 4/5] Add support for custom types in arrays and custom collections add new test platforms and unify msbuild conditional properties minor code cleanup PackageIcon instead of PackageIconUrl fix for simplified syntax on netcore3.0 fix SinkWithConfigurationBindingArgument test (wrong argument type) --- Build.ps1 | 8 +- README.md | 2 +- appveyor.yml | 2 +- assets/icon.png | Bin 0 -> 22995 bytes .../Serilog.Settings.Configuration.csproj | 14 ++-- .../Assemblies/AssemblyFinder.cs | 13 ++-- .../Assemblies/DllScanningAssemblyFinder.cs | 2 +- .../Configuration/ConfigurationReader.cs | 54 +++++++------- .../Configuration/ObjectArgumentValue.cs | 70 +++++++++++++++++- .../ConfigurationSettingsTests.cs | 40 ++++++++++ .../DllScanningAssemblyFinderTests.cs | 2 +- ...erilog.Settings.Configuration.Tests.csproj | 16 ++-- .../Support/DelegatingSink.cs | 3 +- .../Support/Extensions.cs | 10 +++ .../Support/JsonStringConfigSource.cs | 2 +- .../DummyLoggerConfigurationExtensions.cs | 35 +++++++-- test/TestDummies/DummyPolicy.cs | 48 ++++++++++++ test/TestDummies/TestDummies.csproj | 7 +- 18 files changed, 258 insertions(+), 70 deletions(-) create mode 100644 assets/icon.png create mode 100644 test/TestDummies/DummyPolicy.cs diff --git a/Build.ps1 b/Build.ps1 index 4830b07..0221e67 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -2,7 +2,7 @@ echo "build: Build started" Push-Location $PSScriptRoot -if(Test-Path .\artifacts) { +if (Test-Path .\artifacts) { echo "build: Cleaning .\artifacts" Remove-Item .\artifacts -Force -Recurse } @@ -21,7 +21,7 @@ foreach ($src in ls src/*) { echo "build: Packaging project in $src" & dotnet pack -c Release -o ..\..\artifacts --version-suffix=$suffix --include-source - if($LASTEXITCODE -ne 0) { exit 1 } + if ($LASTEXITCODE -ne 0) { exit 1 } Pop-Location } @@ -32,7 +32,7 @@ foreach ($test in ls test/*.PerformanceTests) { echo "build: Building performance test project in $test" & dotnet build -c Release - if($LASTEXITCODE -ne 0) { exit 2 } + if ($LASTEXITCODE -ne 0) { exit 2 } Pop-Location } @@ -43,7 +43,7 @@ foreach ($test in ls test/*.Tests) { echo "build: Testing project in $test" & dotnet test -c Release - if($LASTEXITCODE -ne 0) { exit 3 } + if ($LASTEXITCODE -ne 0) { exit 3 } Pop-Location } diff --git a/README.md b/README.md index cc443b4..7c59c2e 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ If a Serilog package requires additional external configuration information (for ### Complex parameter value binding -When the configuration specifies a discrete value for a parameter (such as a string literal), the package will attempt to convert that value to the target method's declared CLR type of the parameter. Additional explicit handling is provided for parsing strings to `Uri` and `TimeSpan` objects and `enum` elements. +When the configuration specifies a discrete value for a parameter (such as a string literal), the package will attempt to convert that value to the target method's declared CLR type of the parameter. Additional explicit handling is provided for parsing strings to `Uri`, `TimeSpan`, `enum` and arrays. If the parameter value is not a discrete value, the package will use the configuration binding system provided by _Microsoft.Extensions.Options.ConfigurationExtensions_ to attempt to populate the parameter. Almost anything that can be bound by `IConfiguration.Get` should work with this package. An example of this is the optional `List` parameter used to configure the .NET Standard version of the _Serilog.Sinks.MSSqlServer_ package. diff --git a/appveyor.yml b/appveyor.yml index 396e0ef..f7194df 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ version: '{build}' skip_tags: true -image: Visual Studio 2017 +image: Visual Studio 2019 configuration: Release build_script: - ps: ./Build.ps1 diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0ffa0195b647acbe1a6ca1f4fe621915c21a6322 GIT binary patch literal 22995 zcma%jbyU@B)aIePJETEcP)ekcl2RIJ5T#2%P`VpwRHPA5Qo1_?l@J8!l$H?b`1ZLo zv)24KbJw~{Imh#>cfZemVjm(OYA6xl(&8cz2m%%5`&tMD3j7rXfsF}&7`qicg+I`r z%c5Pa@!F92aH7=LiI=H1dCx;4fMR@FI=7f`PlX^HcX17H-yv7cXA$+dA1l zx3X}t=67~`_U?}aEds%WP`NLw0P&p%^+`1aP_XHOrjUB2`dT+7(C{GGAp zleTs$!P`f|T5oP%w3zO(751j;S#Z~4fA#Fmct)%7ffPaqM%J-c1Pi(YCRd2!+Mrq+n0 z7a=faaAsuG<-2tMjr2umXec%zuAHJ`nA-FzmKB29jtvcqAZYqz|F(15;ObIVEZx2Y zpZagdzrlhCeBn5Y+FBP+j}+BuCBhqW#ttRMQ@{WF6!{UWqIq&&p7B&%v)_$p8d<5T z(?RC=2>I9!+e4elU(MMZ`D@FN#7`mb;AV10P{)NQLPwqH3z%Hx64jw&kh%+%x*6pPDS z(MOn=@Mcw^W~J4%NJGsnF63pi+LV;VwP!OG6&3ZD5;02qv`>wH`n2Mi#YBzP{%~i* z(lY4o^EEkHS--mHa8r61n0mix&;kxc%LEfJWN)PmAlPF} zcaq%>og$2wX*`>Clr6{mX@VY@UyTEP_qORT;JF2kaW3>qw^v06`M*{a4^Vxx&DTKF z{ztHTs%uY1W+H<+l$;8cF%yv%6mZ@*Fd=AnBimVpy4>ua4|~`Jg1D93iv~{&9qk*w zzZqF8zL$5nf7{d{szWo%jz;&Ao-K}Gu5u*$_cJnWyrJjahe3TBHa?mLmcrM?(od2+$tE|{9LV;Y%C;Xo|9R8W$aeC!%%js|*U-n^L=qdE z#QxZmJ7?2H7vn7#T|~s9g5`5X-@51d)KOaI+R7uRv>K$N2D&{h+6=qtLb2Y-ODI3a zlzE0_$u>UMcyVm(N;~?2%2hJHKQ?6=4LeWg=$>-p!TEgb;}q#naWZ*IS9(55V7_X*zFZ>QyK+7K z3xNA9EkgRPS-1UA@4M@+>&qL0vEDR1XCIP9njiftFkkrT#8ei8VlzePGG%ZoJ9vgJ zA%!I&p{|B@|B;q5e$FYus@Xhy+~0HclN@`Lm|u??G=F6Uu57jUJ(IC@J$*j)K5`?e zo}3C1|D7~?TKf4w)-oq58fBDO8hy?)^z5npgCOczBd=PX2=BY`qn1oQcZn+#(-~2_ zJAdryc4x#MFN->A;_r5);gq*kQ%`QnTofT5`JH)Z%hOz*Dwbl4&Id_Y_D^~U3G5H= z{w?1{rNfH6_W!6Go}QJ;zAL@3K)%$wl%qpbL4?Y?y1wn!zI^P`!i(lRczsmB-hR5; z?UHreRAJElvBmebxm89IO39{TOhm1Ym)OJ+h5tz0H;^LFabq}r4U3stC z6ze9d({M&6r>m~aLrv-K0wyXim)wK>#~uOvtOJZq^m5d{Keyqf;oWyajr*43B#p9k zkFQClf0eYXn~0lj4|KU9hL<06oR;t`W7$qa&8*7t)fd}GF`tq9pa_T zHqJ`@h@xY9a&|;n|5N2xUNf{p}`?U5_vdx6ml;Dr??{T5Kn0LB^Kn zWxTNphih#UDe)<(#G*CT5A7dcRb`j*GTf!fUF)D&t6gF#F;+ku%JZu_$dZ<#_*2)u zit7AFWlmJ3$g3Rt<%xH5tI^f<_ebco)xMN-zbvwb6x>3JXYVJF0F$TFJYi;fV2LWxFVQ+KkQ z>gYx?_FhXj;|K50QYI?;XLv@NHS@83F&DnK9?0i4#zs)Mxnj^6 zIJCP;R^BxI`GWuCJ14d(LepdR?l<9^3UR>lZ&%nL{)iJ=f;@8e`b5F1|8Tj&X~#qICb9+L>Ls)*StvFDj_TeNTVf zMqVwv|FuucXH41M;_j@hyBD)X<0oh-m93l)W7nY z6TSL0ddmsrouh)Y#fST-IhXzCgnP=GC|7@U?mlVcy-U+xn{e0{fz2X}i@nJ;wY#81 zx%jKj*=OAEkuuIkWYBLv_GH&v7-XL&c1j|Mbtnid>rK-&OQ@P(p-bT0oN?iCTHIs3 zzURtXBft@s>G(BLp}W(^lK=dGkhtp8!Q=aeZmr4j1jN-t1jMcfn%}Rlj6I+HT~s-J z*_yA*@Bi!;iTro@*EfxAaTeuXS+J9Q|MUZ+NH@)3?A3L;SGu=FW!u?-qDxy+8LE`H z%q^m9M>9(gQ^Qz;7yVuu+fzF9*85)Gg%{UbjzJ5aUKjnSwec*Jt{!|574v7`BCguh z5xFmj=kF=y_+0q*82C8ZuGYs!O~0-?MsQi5eRtNuCUz{}eo%tr@%iS5_++uuP1`gqLiN#dZd-Q?jw@$OD4)@ml z*oDxjsX05T5#E0xVEZ^18;%MI1F-hl=(Up@=+lyE!CY{h@&OLN% zBb6f1{H`jUk(#6UzqRZg3=p{g-zpZVdvOg5SahD!e7wn?ta}|ci z^D;ATv#_8N5)z*5%UAdXhlOEwc6H?d2Kv8#9e{Sel6+Df)S@Us^t{>f@ttbR|Rt7bykQ0ja40 zLgu6uuFHz`O-*_E`S;g7R8x5atE%p7c;e#WRf=inW;>UQk&1zy zUD?>U9<5Me*@OEv2TOqE8{UqIU4f4f=m@m!oWrPbHn>_c9_5(kE z{=6O?+P>?GLio@fwQpYqo*y}I zay~rYfID7XSqafD)QD_O?OJ5w<;B0jDMsn5qS^O$!JM2*TTQ-Kh9?H4NHN{W!2Dz3 z%}ED4`?}N9Q)($6F@7`3TbgDzHk_D*^vcC8+3hkbD=V+df@Q@8Ftgv9J6Z+rlW_#} zSU&oA^WHtWU@Rg2L0}grvm+8x9L0rH*Tgkz7K)>+?k==v?VAd zg~GIz{B=+X>gMLAT7V`&pddn*Sma$S_>sAF1?;PhiAhNo*4FGt^chqOKR)X6j5^*% zks3!HOi+xT@afmLp-$vM4qg&odk7H`k^cUE;-;^EW}8Ox!UG(7EZfmfbZ$W%w(ISph56iZ;e^pTn+mYkq;&$^}J$)M1 z^6FUYK+qi3=i|*7l-G9%=tR16d!k3074QZ;Ziu^MJ2^R#HcSujv@01J()^~Rw3%p? zJox)JAuTPudB%8Yw^>5M?@&3H1Rw1#H5!wWkdScY!vIQD0$k=1@8`$KK*JmZN(cGU{6eapzf zQlmP;va+)L>2E_rO6{MmElW?1*ME^cr{ZN29xa~FM&Ug_Qqbn(lX!Keldr)X{6s(- zK_g%IIy^0n3XXWw^_T6B4;H__zR90XWos|goNrARvc_Fy`jFZ3GRN@mZvz_QfbDIE z2OfeKVI%0t%!<9ed;9+iF80z=Q(@Nyk99daI>y42e`semgUI?L`EvMR@2}0T&+MuE zW^rM$v?E%KXjX_PVa0D~e!qI9t+&s`%^d_71i;JgYG{ag;=VaU^W)j~{GG+MobeJG zfS`wu>z|wuz=r}9cIVP}Ruv3;*4BoyD(dQ#3=Gn{t-VpCbbj9GCfE~PA4W0#`}@&t zq0Wc;`hA}R5RYp$?8TuLZvRBX9L`-zdiO3`HW-sxLc)0I^MeNu#5^{W)lhw=);BF% z>qPlfR6-xM$)fQZ*5a35pQ(P_x!4fEl!=-oU?hA&tK-w^e@)24!*gFzF_F8?euDpS z`&W|t`I|RyuyOIpX%_NI^UxU0%pPbcBxdL4qPDTC4##00Z@k5|LgaVbP*I6J!Y)}% z$jl^ERaNco=}F+;U0cJV!nKoYMr2)IoolXpsJ{~lEze@y{8_5n$akBQho`G=f~xnu zI79=|7`=#L{OF#b^X|xsnkrcGrWd>B78ZehZ0t4kH*Qoq{JK556HT}9qu$kO>Vmfa z;U_)5ug6DWhILM0zKeqeOlwi~D_z7_yu{Igb0Q@*H4OF=v#@ZAj<+GkNl|ez@E2*? zFW&ZXU5n;FGwxPL6pgV_qsfrL_Da9=g8wTYFXzO+l`mul1_leTAMyw6?d=DlM&K}e z|BjWCKB%kIp&_t{7}#p+4M_k;xS)~{7{|ZgVp<_=WK>je@F@B3>uYNdc=Yu3b&Zaa zW=Z>V=w_yMC{3YA4Gavx#>R7WbR6A5v=?g^3OLP(;WJ9nE5*_0=upY1b@awE#xDwC z7ym?0H$X&<6>DQjwYCamzZMSfi=`74a9NOfVr`wkJ+$cJveb=pxH%r}&ItDW^6u(j zXxRx5H+ScBAJ!Qu=8?|I!Rnxki;Ik_tKb7wRoBfiE*o3h9B69En-~FvH}1(5dpas6 z8l%UcWCuVup*%m&i!I|{ZTy}kO=M(bw6eCARK_YKL~hj^!)#)jfnX#I4{rFo)-~K8 z;eHQ6Ohy*WEFYG9N646;YVG^`;Ex}<8-HX+7L}J1)tvp?-|Ijd@VG1nYo3jORw&^5 zv-R-LksRZRkvyfv_4SC(PPtJJFX$Af2dnvmY01gv9xfHb6#kUap)^%bA7yT`v9Y!H z_F^_PH24ht)k-xSt;jx}F!Rq*N#dyY-(|?-X$ORUEhDc@rkctpuN@U_hFHwM15YzK zIr(*&)o`}#WShSmBk4vn){9*2i!j`SO_0xcsSSC7Z2v$t+*?0N}L~W_5lmIl3%1tFlJ=kX2 zZryJ0gWLr_zrN;Zu?x$<&~S0NFP=1Iy2hR=0;N<5I`}B#&b9+*@LDPPstf#`FOF4~7w7oCiUf*3vh;3HG&rb@Ih#>|`$gyj- z-W3hFLRX#hJm*9Yb~G`77q&Z|H@%ckx?7fnq@R}4ztaMPXgj|b6I-p8xoxI zva=D;YU@3=C^y7UI{qe;zhHhu9aDjAg+P}peBHOu5$yVB=I($mt&k1z&vG-(;9X%WVoyjP-v|x>;pigzk8Pym%^#4PDN>fk6?7z*|s4$=>Pil zK0HF#%QKGw-`lru%NZC@v%e|5SLe*Crsn_ZGZ8w_$&>wM*Rw-gt<|1TyXq%~cAt?~ z!M(7u9Wz3XF68BNdVrCdni>%sTVPCeW7@a4xOlSJHfeG??#cAQ;bC`2FqTS63i-#E zIM&6*oh&gZC(^u>cz?(^+MP~Z20VZs5dQxC+v{+hWVLa9^3QoK3*F3xX zi_oUZ`tIJ4^fi;1m_hDs_l_TG`Boowe}pL5HKROy_^{pK)-8j>Kk5x-g_>ENGc)wg zbImz9&&KM`q5D*L{Xv@}D9j&t(1@7IS0THvppXN_kw29e42TLJCe^YE4)lr= zamV(C_bh-+=7&mf%PG0f1BG_Y?3}KsY!tsrbh#-5JV--B1G)B&c}yx6Aqs4HinNH# zT!I_ZQdIoL0i~sU2L}f>>ok%hzID#CoeZSKT>}UIw)C}@KENHgxVg#6$ptAtW3}zT zj*ifb6+$2b+vrG~)t7M$l2MQH6mzn(1Hw#6rhO9<5|ZU&wG)#n;kE~u%YPXft`AqT z(ti4+YOMF@5lNn6tQ_nJQZh2Gf5Esh6%jUe87LJr0*Ee~;qCdBSE4gBGd9tDt)O?J&ZAS(DqedFC|X)t=Jxig zckL@beBi*x$0uf_Qi^^UDN#&<2^ylqeoms=Y4)v_STK6p}M+VZy7bcAg7#leZ|OiWa6u~JIq`Yhe7je!alHd>?gAmxCz z0JlIV%j)SeK>$cvc9l;{OO`P-cQB{xoT=tM z%w*8Wl8SYnZw01CUs+j+O|~2e2fcOoE{&0>Glz*O`INZ$-doZ51D`jH{QUf4eivfa zDeTA#ME9>o86N*3|15FNyr-v!TEv0+d#0q(Mh0laRDP2vsFtpuKWk@V9qjFS4m&=; zrNVPHAfxB4!6*WL+R-Osoa&m07T?Hj~Gbbm0%^F zjaz+a{%uVZ&QKcKHCFU9+9TjdDp;o(65ffsL1tS&OI^>89CJ`^?aO7{FH$_FprW!; zSH_m|J-gpXXn~w~FseZC*-#HCDk*i%%`q6&I*@$an$J@r0#YjXKBSM?WbBDWg7i-W zKD|WxnBDWok7;}38O=7l`r>Z5u6@5zZTmyf=G3Y$ZeLOZ;GmYz=rxnmS;n%gUBO1YdS{#I62GtJ&)(8cm*L=5dd!sXf`Km!F!`JO*8=9iXc1dAi3`wp$J zT}ailAvt+@d7IPZWb*ALvJm+`&-uvZJ`z3!CEC7`Jg&7%w1^f@I=Xic<`+-@t_j)< zGX+jNLoZeUUEEC);jTp%s&J)@Hr&%4GKQK8S|n4#Tk8*OXIW?yk82&cJ~zk56GcTw z58lYLYP!WCPTQAXKRYor5S3bgOm)jN+yD9sbvA*Ol@%#i1q5vdQ~6+p2*9)%@MTt2 zC!;)NB|y*=W*zU&TY+zq5?5~AK-z0L_TpsEB17EcfBCc8RvQ4dBP7g5{qqw#?0;Hi(G~UpPgnh| zP)8U6-7t`FA*UIG1%a!@uJCj*SIY*gYKLRrvk+lsX07Qzz?Ou6f6vmqE5pIcil(Qh z=XH5jV=xgt(!?XPL%^e`&*`w+MU*F%O0`^@{PP464py|UBY3D#5VPT5drWZ=kavJ`+ul`Z}kgl#z4BnnWqt9Jy zB}UUfZ2(5vAC<?x^?TZ5Yx*y@2tMhG=M3X4?P%8(7wPd zKdjby_l1Q;&iyH*d!hh_;mf0KL#}yAAQ*k|3<_%QLIvXJ9hQ{>RzGbz8sP+}2xp}76iO-r0%$_D*!rL-M+)2*0X^-Q)@_vf2;<>IKcX z(H&>GHb{lr8{(aax(Nv#cx(ta_}y(0%WIXT6JhsTdW;1)JdHCuFHo}8YJjPdO69~^XkwjM;!eBt5IQ)$&lZ9#&oV~-}_HpXf5 zx;hUav)cOojr87dL^KGQAbB}XY5G@3+Z|wK z*>0w+@R~G|KVSP!;WhXDJ0WOCdFZQ8CO;kMJhMo!vq!uYaf}KK#!BKoU+yCUMxwTI zVFuI*ysh@hN~;9$m%GA=#=A2wtiLJT&=d#DUR!886QPZ)6nISsYstkQ{BQf`BJ7|&H$7y2yo^>k2Vj#h@RcF zFUeSj##k(I0U9Iv@-l}nw9aE^s%CL*Egae)Ec%G4G|hdS=xV!h+>wzHn_Eh*-#1x! zwMy}kesx$<4F0{BheZzq!;wCWm{_{Q1iF^7af~{h$U=Vd?+b*$^dR0&K}qh9X7A@9 z;i%yl$(->aa$f9d0QNSRX*0{l_@|+S%EOxvgOD zXt0AXiVsR>Jg8c^1t$&IS4fEl?ulxz>`?;P3EFJGv$Nzl>tQHrC*;IX$a9>0YRo=+s%O%^^r zg6F@#CfFO;+u3oy{I|)jWzgN*tN7pXD3Qm@{#4AxRhR|leCz&|L`g{r_ZRO+Ir;hM zeepMf%j4t64$o0o>cby=mq#FF zv$*xlr1c{wlrBEv7q7IbsVQo(1JXsC9*!AYW#Jd0{JZwOXFpG=pwZvS$s*A8&!6PY zh2m59?MV{YZKe4UY&d6UXAuz*GG1O{j&WLviJ6&kpdwhMq%wC;AJ^C|u8-tV-}5Yq zd8L>6k%PB$W4QHFYd|vLw&PTF2PY}dFmMoZJJ*R4L;1nsJvh@OF>O=?9##H_#lEf* zBhjz<>u-%7J`Bi_4`2HI?Hwl{U(fq{FDjr&g=~fqy}iBp;i)fQzD$?!zOAFHOF~5z z9u$Q7;4(QGfMlsZffY`VWk&Nt7id-r@U&vc7e)2k!@FZ-m+tMuu&>`$Mff#qx6 zdT(ceP!t!>)%~PLnzHED09I*V+AXt_%-zufJkLKfDrZ>8OX$KPs<7J9%aCxDTSz5; zPfbT>H5Y`D?DQ5%?dk85!cFnMkhpb=2#G}SWI&r_mzJu3^n-Q>*xorid*k}@n2|y9 z<^9I;C!D;z_kpd6du*ahO13;$^R`!kndOLtM4nnPWJJKl#Z^&LQy>vDF*X(w7>Kg8 zyu?PyU3{R8z`($8-RscmdFi<&piN(yYy1H7x ze^KrMk+kNwaI;=31{@q50a4L#u#e~3{52c-An8ITVSrWZ8cWA{sLto==@tD0DLf>Q zMRu9$e&EKA*6~Ig9vOa}{F1M2B~#+;csJhf@+@If(@l$1ZlWaN@r9H$(ht^E#$FW- zWwVn4AsN=%Dus%Q$~l|O!NGwP%Y^h|2tGc((SORgng$_eA4M4OsQ9}-sK2wTu24=9 zMVP3ov-2mte$DjIJh8`;nG-O_3~ba2kH1gfDE4^>3U)w(_bA%(NmgB5UALVS#7cX| z$4b++j;lnvy(-43duXuu~mBbB82UK zVoR)naj3z@T0+Pu&L+H1=r@T^9pH^e`Ox#>;|4c&_FH`b;pQv-3F|)!i3*hKkYQy{ z6ovAG2c3J1T`Ci-IL7??`4#;D2gvkjKrt2ffRwU$6f+yrInp6p@M~P)^}w}4wKsAf zZ>dB^){~RSek{p{tB85=qVEKUjFU)H)Nu;k%*^cZna6T3f%_k@@js}OZ5psg>6Jc4 za+~^>|G346U&k5K11e5VPfsXYByc+-Vq#+0_@4vk3Ov7p)*p@$Nj?b)=wz+OC$+FE z@P$F>5s9E-X_eW}xB8~vea=D9a;6SFyw>3ts)>n-!%Tfb;%nPBzstS7MS1v%1mcJM z%CrkZzzYubw`>m$x~HaS)A&si-^tx#diCE)`_b!lz789ug6W#{GS9TlQ{B$CabUF3 z!@dL;hq>m@qXg)5P~awZid&#rk!OvGjpbs;UUU&d`kb&hf{s%{#X~(WwkJ`jsHg(N zJ^?feKQPE2phbXJOG)}iVQpmvyM^Zc`}gdBlw@U5G?WDmvG(p2{5k*;|0pyzBBC9( zw(S>l)~IJgnK{sik=Y{BHE7IKjHO-7^1lM6M#LFi8YP!pp$wZ4k|*{bCecy-|D7fP z=$~ry<%`8mjKH~P(0W+ew>-F5P$7{ZO(Uby)z$SnKQWJaN5?l30rpXFX=$k%!`0^u zh?c>>@5@z)=5)0601TWcH|yJ9?mKWx-k@aI4jR_B+p$iw}jqM_xKmk)^s zC$fRN#l*#hgMxyhWt86JcPS40?$&U0mB-f4h`2b#CeNMx(N-~KBZK@+S_J9TdgpJo zJe3s!pZ$vlo!U#gi86wTN~^`KweU0Ys>1_iRaJRl8LOMi-x-Qk0Foeb@N7?r#QXNDN*b{|N;H1Vqk50|Vv8G5}f@DJh0~FaCsp z?-JWW&c~bk;X~M9+O0gOnCe;{oKa%R;?I~eqZsY^`D}q}{Us$g+1W=(7YlQ9gFvxi z!0Uzf3!8hlzM zXwiwDUr^97I2f%boD1esC$NN~3S}>^`mfE@7_xpgd9H8RAQ(Mih9BS;)lzy)dkxpx~iJ0vH$_v0oy;#=uAx1-bvkfSLYa9^@#_BsM1FU*^7%)vbeZ7gEqgGe*4mr5|^DR z;Z{@6qoX5bHMQ<}|7+v~$LN%jYrXphDLw(g;wt2fvFn|ocw+un67whiw|&l!2tcaW zyDnqS{{?yqu+Rsh!qzsP7lsYwv_C}3j|(FlzBF>E5roE|43CYGpO=>A=ZAn{!Xm(l z?O$$;6Ft{bz>@qXIXMK#?ov8+oC@4sZzvvB2yOOMjeXa|1QoQ&{5q9l5UC-cBOwv7 z1n(xXYucCle~K$rR5yXj~fxiJ38!pY(h*Er?7Z;BAtjntV*e@z$0g9p{MQmj4lAnKP5 zkOLf`+c_*Zt@h;!BJAi2dZn1x&YSuuCnsl}%BVvv;8=GI z3`FhT_4oJBShlh~enDSF1e+LI%zJr!j_X+Ik~JKV22f5EL4Z)CeuZ_E#!5(BKCX1~j~ zZoZmXQlT)UvAwf{44x_niavg1VPivwmwOgEg1L@mwP4#-KKVjgZ9kz=B1~ifT8oLD z9iz3iwMhN8qc{XA8F!yo_?)^0PSiIvF!S=3JpS+GGK%Cmu!Vf$Z*p)97{5>Djf{+3 zpRT**da7Vy>tYWhShpiq%iQ(dKlr0BRJ8{CA%G!a~&y1G)6)z2Lra-OW_S1N6B(KbAK$ zV}!CRxGcRD0WM7Y_&5c)Hr>Fhy19{pA6z2jsxEa$-ZsKpM7s1aP9dkMNkk{&kbP+K zZ)chcK8ECZ%Ecr*la**NX@Pof?&K5)K%SR?j@#nS8uuR_L33GpBvYvI9^G#E8jy!o zDUN(okkg)&lytc2nI^2p7afOc-WPvn0*i~eW@cx5GDYodY|LS+*S|V0Ge&&^!v=AN zRZlzm`?2-QjG0Y{AlfJ_ya@)~!o~*IKI$CYS}1O``^G57qeqWyrmDF%q_h-(Ccv%_ z*xNIeg$Nl};`new8>*sz7W)DoYx-?#+(yrxDCi~qHMiP#OQm6D!TW!_9q=C97gi1q zOz4Ml(BBGX1_xlEs1tY-WP@J&OBfq3X+<0&U_v1wDv6k#*V5cPV13=DIO<)5TsoXo z1VO|o@w)yi5SkIw2<#<5s*#pgFB(F=w|ecP!V%@)i8xj`PK&(xbQHk?Ls4K^D#6Ln zU$*aC9j=cktEhB9=T<5Iti1@vpn!lt02sdP!YrR%NpnLKuFke@b$54X^L^_uPh?Uy z$bUc=ux4v}!jW^~4mjho(od2jx&&On!qQTUOFB~sDQ}Qe2Brd#5DG4~Wgm@@?P$p8 zm9QZ^L;=X0@#)1LZXYg!h?JF)K_n(7E-WlCtup9+fJF3@UTF|?;iKJo%`eR1Y8m$d z48YxE6`*1V#_ynkD}HkN_a_-{1aG_tP-YOJt6O6pQB{Kwa5VId*p9AKo+wko8Tu$U+3=h_e0P#O90L*Cupz2N-g038C6e$QWu ztMnoxgFfcQJxT~lDYssN(uF|baN`G-@7ZA>=*V`-UEm(g5aAAGNh_(T;XBRL2cDdG zjYf$gGjC{~7LfBFHo}cq{46m{zMTFt+VK2YiCG&%%gcYHO<&<^7I$~!VYKk|fQ2TE za8dA@HdBLJ{$Zuyrb@nl5urS4G9@pmuPM7V=!@V+$g~% z9 zuCMT%ot=G7_5$4)`vqPe+Mr`$saBs|1O9(~E3CR*kKPDI69E`=(O?v4{Wm-alo`oc zh6QGz0m57b>IYO)Q)I9u>Xb1_^X^M_ad9MUL@4qD$)W#jiQ*a!GDAbdA{h3%B28F} zVFZ5)9zhV;`|$a0&p-_9<^8{FnopiRgS-TdQOc(sG_H-x>I`JbB?gtK&{#8Kq(X zU)sC7@0)K&aKg-qxuYY2l9E!h{++yc-~Fy_O6SnthZKB@XuQB~Ci)qbI@j^E3fUHsybe@(eiaH- zA09aPq0!NJVBIL)-F&14*#I#OO(ck@T<^cXE$KePl$pgqG8fDmDjFMSeEmz^4Cn;1 zy9=sgq|``s)F>^MRyYU_@%8Ihm)$wZ)-8G{K5RTZc>wd1)=)!U$}oJIAoz;*<3f*r zo8w*3^c4o)=x>+=e1_3K^S>X|lf!14OVeSnG+}`BJ|$EDtnxDav;ObjuPEO457yrE z*wh*LlcytchVbdrr!3{ABCH6+$;Ad)a!N{$5;J#fk7W*o zY)DrLxC^Kv779^gI33d4ftJ<|z144H*{t3rXT}2v6-cVCxEuE#7HZspwh~$$?+Yj> z0P(PmjSZ8CNU9dEBn=X+Zrt-+0Qg@2S^Ca^#uv)o+}W83hQTCW9%3`HZjP zQvQd+v?L6o0ELc@ZvV{WJw5^f6N}_9ZJ7K+B~2I|+BQ-R!4NMD)M>m-9)X!jP1uKF9#rm4|84C>?-jdk^sv@FEQqF zJs@@k->e&WhRfB3Hxk~!s|6l>`tJoWVIg5*Kwmr|@Zb3!R|h~t0-ek3^5_dBG$3hH zix_KbYmv67t$h3Pm!zBNlCMPga5%o0Lw5#gjgxG@tfZmwy}HC*=sge_3`Y4=)zBSNr&!}|i-PGpZ1C_O^B{m3(YJ_3Y{0|CEbtr~yg&%}l0 z6SzNtSqp3l>NetY^9h_8$>koChxMC3dln9kl=72duP@T;$}uYcJ%NxA^Rc2w z$(vtbDAnAYNw3`0gx?K%JTcg2%_*#&u3G742oqBt^j)<0)RsiOoS`2!Pyvt3RM3$D9ty>Q=GcsbJ;F%$u zerkF36uFhb8w7qD24YQ{6qQ*X4jacPjcl3jn`4pHq7X2!oE`1p>Fet^`(HDtsHh;R z6kH&mJNKtgpYVW;1JRUQSMHymXN;!gV;QfryN9}vlT(aS?)`U#*6B+;cvg4>>KyWQ zPO~tch3URCm7*nyMAaY+JeT!h=C?07XdXX)jE##6xDq{ySqe-Ox-T+5;$$af#)Iw= z9*%W&b?yw2ak`cX49Xz2ozZ|8*}?w)fb#NN$kEy~mrbZktBuhD7DhX!yPg$hD*2avOveivTFrOj#IYU$|d z)oc?=l;Rn*25Wf;pNxjXQ?de-s(-PYd4C__;A*>uhlv5!Qw^ISoRV>OKP-0~ zfN3BLq?Tp4g4|7KUKoKGw)=@cczs1D`SPeFxkZV=xWNqr6!~q}K|a_N5V5)fv4i|1 zs@n2abdMZ3V903|k2EC*i8ohqacmgC}|KXJ8=(_osIn%jBV z?n4X?JCB%%K_URS_Nt?;tIcEuvtkT&Ah;Q3^Hhd_A|&M02EK&|{~Fui&}d5CNGwLC z+@@~zS#|;k2M1zWTJEu3BYLFg2VY2dK&bjzPG6r2ltd3Q7O~p zVfv5_=?9X`+G=9*5WtiaF)4XSI1z)+5J^C7tq4q$>c0tRM8>277M&r|y=}8&V>;RX zO+t$p+mMrVLgy^O5QR__*w5Mo_bW@wT>O`3?;tapY4pGYexm@mX7S_++w+O1u3W%# z!#uWJuCF_k#=j$kY^TWmRMQ4@pPLYa;fyrL-@T)Q?HzPeGqbA&v|q!Z zGtHf+{qBQ=2yjT)Q>oK9EW(MFE$`niSRS{;eOTvYa>8e*wHl^_bO45nwQqvsfCCH* zSDuE0#Cj>WBk386Ng+NoG_sbWRqNtc^ znD+!vSJY*p9Yx6gCq5=7X8sn43RVuyOnk61fbKRFlcXdkw?oD72KQ>S-iEgPkv0L+ z0_!z;@dmfk+ef>zJbOMVnW&s#%fL|k6!!3)Bw+{`3~KCBCL6CVhR4ShAj^S{xRU62 z49g5$H=ljFOyV!%wK}5{;5V`WjT;h=_#kV#2bM+nVVBv%hcchg3=hA(n{0VrIBfs1 z1O=%RU@RPeCEKMd9;i98{Yptm!Ql%sem#SkL${&YX<*=LZ*GTby^d{$!>cfsLEm6x zWX#XcH~*S0SlwKTbmCx-kJ=MJ!KX_;=csj>QyZi__*TS;oKwx0El$)%+UYR*+@XW7 z!fMg{@*gf_fyw?0upz|6#jhTu^=K#Def}GtkNftYKYt)F>;^~Ent#p}#+jzZA|L@k z2fwkQh@{2)FXlbZZTMD07Mm6;EqLv)x%W=?tw!zcOTIj82Q!V!7R$KV1;w?p((CV; zuv1TWw(D|l{%1KDmtPu-B%9=UdKJNKi{Mayg9=t2*LVUn9Hc?Z%!~q^nDm+7YR9UZ zAk12a>>K`16;~b)RolM@X)kL+)*(xa>{>APB!wX%!pJg|Eswk{h-4wfW2m|B!>V0A_L zv6{g0T8ZfUfr0mA)T8Or2mqPD=`c3)%UA!zX9n}wSTo4B@Ij@jP4Gtfdk)vPci_^9whtc&M@A{@clp1($ZiZY`ZQQh7JktO-Qc1Ad8WL+q$CQ4Ydc}Ar;!3dsU=4e9bf8 zCM+y0p4Zk|eI3n)UB+^5jL)n^4)Ht^mjG8IoIYp=V7 zp8}*2Fr}P?GwU+Pdx@ls4jS^Kuf~d5aao%g17(RGIsNvk;hx#vB}R1&&op()pMU;Q ze^H-Emxe_jAR)TJh*Mg+)yc)>+_+G8X^4W@mV?&$Gj<+L841CDG|e_P6~0bZFJ3#Kct)*olo5B8Dsh<7pfBtE^AvXZ@KmrCTpk zQVY%I9sk==O6VSLlT#0pr9pM%0Nrn! zu|nP9rgk>Ox$dO6SzD_gnGJ&m929l16MHSZ_o=V1pE=&o3M6H@ZxDyMQ8GyBOWcZ~o!(>(XKEbA>23!{knm>choi^&038WfBO?Lc@6^Iu zAne=jdGeu6sU&w9x_$cmnE~~~53(8zsk%FK%|G{&J1)qaNk+Xs)7lHy;aGwsNInmj7;XTGad* z6g>CzZbS*?wr`g_PUp%bB_#pa8j$HR^uza*oV>g^u*UuPIse{Aki7pgsA0pzy`56H z6V@wuO(1;KRI^3A3oY~yY&w{gYpxjD|}crzt(>W26jt6IVt-!c-8$G8D1!%I0^ zuvTod3pp{$20b7f8@Rz3j-~lu@PsO>B+43lmDX$9u`HoQugy4-by)+=jILsOD=4g(gcvwkQEO2WrDh4FCu;D6*NVS4$LV)_Hl6Tgn)&9F{eshZq_TLyaV z3(Sr;3RVvE_MQetw=Wr|%L3t1Hx6CF9}WtM_$N4qj^LIY#bzy^^Oi*xAKiaD-*TZbMi z1o(8eXM_anX-SAOL=VX`9BhrHi~?i$dGamo#Elb{K5!U|F;jO4^j-+w;kl;lWYA3I z&)?+++n68TP3`!;?XA|x!_kV03dB>5{`yM?QI$$RY&&vTcOB4*U_uSV*H~Az*5I3| z=xZ@Qe}=l22J=9~kbk_pO&4D@v#J>y7y#I_%E;%wNN#g_a)pl;8U0xV zCe=$nqW54ezyd8%w!;9c=gh^r6=Iu=K!cc3g*N{OBp9stB%Umn^1$UjgFp1>QROQ^ zw_?GKVrqc%&~#){5g*0-%|5>Bt;+$SU-fz}QD0>R?(j#O_MR&!Dhg{^qOAl9Oa>mA z>@36aiHYQ_tVHxRm!Hs3j7>~HXC+Fja$x zwbFKOZ*GpOS{RFMv7X+u)D$U$;!=^|c&5kqvSh-6@G+s{wA6(5$M!iw$hzuilR zdfk?V*F`unQegG!zMhh9|BsxvVb>l}RMM>APlz@!?bu*rV*_(LZqpmOkNvOpo)Cwn zS!UGnsi}UN>V z*Dvxs6tlP9eWMG&NX#)9V(&{f;u0i|b)>yMF3`uv;=Omt z{rkpn8;_5Vi#N_;2S;*3&=m55OOZxVt;u||ZT2rkrTYV_SyK9!Cqx0;hF|9aaBr`wr);H zjKN$c;ih0iv&f2377@cnlO(eU7KNBksUP_^+;-SNBG~#e0$A#1(*9tp5Tzi}(fN#r z1s}sf2AbT5dyb4|J=oW$;gW`DpDxD4?Kvjs^GX)xujo0urzgaQlU5QS@FIZQ%8aw^XER zD!CQ;31OFtIPmY!U%uQKE3sE#;%YUt4ECg=j}?T+`S59Vulm9E7`r`BalL(QNwl1- z;G130<)9tPM;0r1YI-LBz$OdV%gQ8>ZSlPk56yN7Xj9Dj!udjXoF6X6EDJ`_^V3m8 zvuhCY?j0G~F|wz2em-(;qR03{kl9dli0`#$&x{@R?|XK9!arwlH%R@%9mT8A(#;aL z2%kNBmXn#e%rKia{O~6FJM>B+aQNT81#0W+Hf0RFR6Bvnin$)!H#{5s#eV!1k|gFs zj#XY!(h(Zw3qanX;o;Lpat*gLHjahZ4sX%WaM?Iye9m#27r;aA+jL0Zi)+As5Q*4v zQkEIkPM_=%6#xh}hfenF^=tOouk+bBBiK}UWzw7yhafd_>IT}7^HlIR1Bc)Qr`wOK z)e&IRgnoZKRwQ8FxU659qLZ7Od%Nt!S}`#(uJ5Agq{|G(eR1NAnx89MtaZh3LmElB z5~d_Kx1W2rPEWrb6seJvmab|1UKOA7(B8D2sqA7;iB6(jIYC#owzg(zPh+fsuLq@+^{HeR z?3SiT452K@i!Q%)vI50NN=l086-dy&Z)s`j3Wg+XgiIXeX-!RB=q>lr;s9^&IBYv0 zQ8t<)yl!0r23?UFa-2>ZT4Ukmr;A+nQKA=|^;=s|x;VGXKpg86zzu|4Wb+_#aQAbn zdrZ9#v6)~HHp0FIb}z3khaa3|&B42SFqylY^*o+*6k6q7y4azniur*cPrH?AR&gRB zA=9y+D_7e4x$)TAZ%Or>pPO+qmvcolLQqQTJT9Ngvz(3x*x1^-ghs1kR>i}7i7Nh$B?gAso@H|HciFS4P)uJs_NF&8GZ}&?hM!DChKi z?j%nJNH;}g<$mzAW^Unl(OESN@TAwFoLVmZWDlV;c;=^f4zuq5eT^%7t*ifha7i4{ zS=;c1mqJOpe7Ui^Tc9$QZ{SN|ZZ03ZDtFe1WiAJHM_U^k3%01<;jm#1It1~2Z*naa zgvW?mv*Y3x_Y2rO2F5R3Sq~nQ8FACgD=Wu4jg6Ze-(DN|k$O&JZR0G?amOaRuYRO8 zI5b>odmr=Ry;os)b+G+$w51}$?1||e3vOzv=?#k;V53hPMFRyAeGy^uTMiA2czM9` zvA)kAjarayZ!Hw6$@u#X8^?Ux(b3r6&i+eH&Fp#N2enO_($KR6Wn?aZy*J*F))Z;; z=jXugE3_yX;9V+Rfh=Q7MH6uImo8uS4LcGL6qE$RkI>&U4*MMYx(EMU(l`9F(W>(T%K literal 0 HcmV?d00001 diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index 22d6aea..bd1907e 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -1,10 +1,11 @@ - + Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. 3.1.1 + latest Serilog Contributors - netstandard2.0;net451;net461 + netstandard2.0;net451;net452;net461 true true Serilog.Settings.Configuration @@ -13,7 +14,7 @@ true Serilog.Settings.Configuration serilog;json - https://serilog.net/images/serilog-configuration-nuget.png + icon.png https://github.com/serilog/serilog-settings-configuration Apache-2.0 https://github.com/serilog/serilog-settings-configuration @@ -21,17 +22,18 @@ Serilog - + $(DefineConstants);PRIVATE_BIN + - - + + diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/AssemblyFinder.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/AssemblyFinder.cs index 4d356a8..0dba18f 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/AssemblyFinder.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/AssemblyFinder.cs @@ -27,15 +27,12 @@ public static AssemblyFinder Auto() public static AssemblyFinder ForSource(ConfigurationAssemblySource configurationAssemblySource) { - switch (configurationAssemblySource) + return configurationAssemblySource switch { - case ConfigurationAssemblySource.UseLoadedAssemblies: - return Auto(); - case ConfigurationAssemblySource.AlwaysScanDllFiles: - return new DllScanningAssemblyFinder(); - default: - throw new ArgumentOutOfRangeException(nameof(configurationAssemblySource), configurationAssemblySource, null); - } + ConfigurationAssemblySource.UseLoadedAssemblies => Auto(), + ConfigurationAssemblySource.AlwaysScanDllFiles => new DllScanningAssemblyFinder(), + _ => throw new ArgumentOutOfRangeException(nameof(configurationAssemblySource), configurationAssemblySource, null), + }; } public static AssemblyFinder ForDependencyContext(DependencyContext dependencyContext) diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs index 95584e2..102b492 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs @@ -50,7 +50,7 @@ where IsCaseInsensitiveMatch(assemblyFileName, nameToFind) return query.ToList().AsReadOnly(); - AssemblyName TryGetAssemblyNameFrom(string path) + static AssemblyName TryGetAssemblyNameFrom(string path) { try { diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs index 3bf16df..29a13cf 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs @@ -220,39 +220,14 @@ internal ILookup> GetMet select new { Name = argument.Key, - Value = GetArgumentValue(argument) + Value = GetArgumentValue(argument, _configurationAssemblies) }).ToDictionary(p => p.Name, p => p.Value) select new { Name = name, Args = callArgs })) .ToLookup(p => p.Name, p => p.Args); return result; - IConfigurationArgumentValue GetArgumentValue(IConfigurationSection argumentSection) - { - IConfigurationArgumentValue argumentValue; - - // Reject configurations where an element has both scalar and complex - // values as a result of reading multiple configuration sources. - if (argumentSection.Value != null && argumentSection.GetChildren().Any()) - throw new InvalidOperationException( - $"The value for the argument '{argumentSection.Path}' is assigned different value " + - "types in more than one configuration source. Ensure all configurations consistently " + - "use either a scalar (int, string, boolean) or a complex (array, section, list, " + - "POCO, etc.) type for this argument value."); - - if (argumentSection.Value != null) - { - argumentValue = new StringArgumentValue(argumentSection.Value); - } - else - { - argumentValue = new ObjectArgumentValue(argumentSection, _configurationAssemblies); - } - - return argumentValue; - } - - string GetSectionName(IConfigurationSection s) + static string GetSectionName(IConfigurationSection s) { var name = s.GetSection("Name"); if (name.Value == null) @@ -262,6 +237,31 @@ string GetSectionName(IConfigurationSection s) } } + internal static IConfigurationArgumentValue GetArgumentValue(IConfigurationSection argumentSection, IReadOnlyCollection configurationAssemblies) + { + IConfigurationArgumentValue argumentValue; + + // Reject configurations where an element has both scalar and complex + // values as a result of reading multiple configuration sources. + if (argumentSection.Value != null && argumentSection.GetChildren().Any()) + throw new InvalidOperationException( + $"The value for the argument '{argumentSection.Path}' is assigned different value " + + "types in more than one configuration source. Ensure all configurations consistently " + + "use either a scalar (int, string, boolean) or a complex (array, section, list, " + + "POCO, etc.) type for this argument value."); + + if (argumentSection.Value != null) + { + argumentValue = new StringArgumentValue(argumentSection.Value); + } + else + { + argumentValue = new ObjectArgumentValue(argumentSection, configurationAssemblies); + } + + return argumentValue; + } + static IReadOnlyCollection LoadConfigurationAssemblies(IConfigurationSection section, AssemblyFinder assemblyFinder) { var assemblies = new Dictionary(); diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs index 6b54c34..e1730d2 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.Configuration; +using Serilog.Configuration; using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; -using Serilog.Configuration; - namespace Serilog.Settings.Configuration { class ObjectArgumentValue : IConfigurationArgumentValue @@ -47,8 +47,72 @@ public object ConvertTo(Type toType, ResolutionContext resolutionContext) } } - // MS Config binding + if (toType.IsArray) + return CreateArray(); + + if (IsContainer(toType, out var elementType) && TryCreateContainer(out var result)) + return result; + + // MS Config binding can work with a limited set of primitive types and collections return _section.Get(toType); + + object CreateArray() + { + var elementType = toType.GetElementType(); + var configurationElements = _section.GetChildren().ToArray(); + var result = Array.CreateInstance(elementType, configurationElements.Length); + for (int i = 0; i < configurationElements.Length; ++i) + { + var argumentValue = ConfigurationReader.GetArgumentValue(configurationElements[i], _configurationAssemblies); + var value = argumentValue.ConvertTo(elementType, resolutionContext); + result.SetValue(value, i); + } + + return result; + } + + bool TryCreateContainer(out object result) + { + result = null; + + if (toType.GetConstructor(Type.EmptyTypes) == null) + return false; + + // https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers#collection-initializers + var addMethod = toType.GetMethods().FirstOrDefault(m => !m.IsStatic && m.Name == "Add" && m.GetParameters()?.Length == 1 && m.GetParameters()[0].ParameterType == elementType); + if (addMethod == null) + return false; + + var configurationElements = _section.GetChildren().ToArray(); + result = Activator.CreateInstance(toType); + + for (int i = 0; i < configurationElements.Length; ++i) + { + var argumentValue = ConfigurationReader.GetArgumentValue(configurationElements[i], _configurationAssemblies); + var value = argumentValue.ConvertTo(elementType, resolutionContext); + addMethod.Invoke(result, new object[] { value }); + } + + return true; + } + } + + private static bool IsContainer(Type type, out Type elementType) + { + elementType = null; + foreach (var iface in type.GetInterfaces()) + { + if (iface.IsGenericType) + { + if (iface.GetGenericTypeDefinition() == typeof(IEnumerable<>)) + { + elementType = iface.GetGenericArguments()[0]; + return true; + } + } + } + + return false; } } } diff --git a/test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs b/test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs index eed3803..a276dac 100644 --- a/test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/ConfigurationSettingsTests.cs @@ -584,6 +584,46 @@ public void SinkWithStringArrayArgument() Assert.Equal(1, DummyRollingFileSink.Emitted.Count); } + [Fact] + public void DestructureWithCollectionsOfTypeArgument() + { + var json = @"{ + ""Serilog"": { + ""Using"": [ ""TestDummies"" ], + ""Destructure"": [{ + ""Name"": ""DummyArrayOfType"", + ""Args"": { + ""list"": [ + ""System.Byte"", + ""System.Int16"" + ], + ""array"" : [ + ""System.Int32"", + ""System.String"" + ], + ""type"" : ""System.TimeSpan"", + ""custom"" : [ + ""System.Int64"" + ], + ""customString"" : [ + ""System.UInt32"" + ] + } + }] + } + }"; + + DummyPolicy.Current = null; + + ConfigFromJson(json); + + Assert.Equal(typeof(TimeSpan), DummyPolicy.Current.Type); + Assert.Equal(new[] { typeof(int), typeof(string) }, DummyPolicy.Current.Array); + Assert.Equal(new[] { typeof(byte), typeof(short) }, DummyPolicy.Current.List); + Assert.Equal(typeof(long), DummyPolicy.Current.Custom.First); + Assert.Equal("System.UInt32", DummyPolicy.Current.CustomStrings.First); + } + [Fact] public void SinkWithIntArrayArgument() { diff --git a/test/Serilog.Settings.Configuration.Tests/DllScanningAssemblyFinderTests.cs b/test/Serilog.Settings.Configuration.Tests/DllScanningAssemblyFinderTests.cs index d8ab19a..be937a2 100644 --- a/test/Serilog.Settings.Configuration.Tests/DllScanningAssemblyFinderTests.cs +++ b/test/Serilog.Settings.Configuration.Tests/DllScanningAssemblyFinderTests.cs @@ -65,7 +65,7 @@ public void ShouldProbePrivateBinPath() AppDomain.Unload(ad); } - void DoTestInner() + static void DoTestInner() { var assemblyNames = new DllScanningAssemblyFinder().FindAssembliesContainingName("customSink"); Assert.Equal(2, assemblyNames.Count); diff --git a/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj b/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj index 69ceb38..09e0177 100644 --- a/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj +++ b/test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj @@ -12,14 +12,15 @@ --> - net452;netcoreapp2.0 + latest + netcoreapp3.0;netcoreapp2.2;netcoreapp2.0;net452 Serilog.Settings.Configuration.Tests ../../assets/Serilog.snk true true - + $(DefineConstants);PRIVATE_BIN @@ -28,14 +29,17 @@ - + - + - + - + + + + diff --git a/test/Serilog.Settings.Configuration.Tests/Support/DelegatingSink.cs b/test/Serilog.Settings.Configuration.Tests/Support/DelegatingSink.cs index 710d0c8..07a848b 100644 --- a/test/Serilog.Settings.Configuration.Tests/Support/DelegatingSink.cs +++ b/test/Serilog.Settings.Configuration.Tests/Support/DelegatingSink.cs @@ -10,8 +10,7 @@ public class DelegatingSink : ILogEventSink public DelegatingSink(Action write) { - if (write == null) throw new ArgumentNullException(nameof(write)); - _write = write; + _write = write ?? throw new ArgumentNullException(nameof(write)); } public void Emit(LogEvent logEvent) diff --git a/test/Serilog.Settings.Configuration.Tests/Support/Extensions.cs b/test/Serilog.Settings.Configuration.Tests/Support/Extensions.cs index 02e3487..d4fc730 100644 --- a/test/Serilog.Settings.Configuration.Tests/Support/Extensions.cs +++ b/test/Serilog.Settings.Configuration.Tests/Support/Extensions.cs @@ -8,5 +8,15 @@ public static object LiteralValue(this LogEventPropertyValue @this) { return ((ScalarValue)@this).Value; } + + // netcore3.0 error: + // Could not parse the JSON file. System.Text.Json.JsonReaderException : ''' is an invalid start of a property name. Expected a '"' + public static string Fix(this string str) + { +#if NETCOREAPP3_0 + str = str.Replace('\'', '"'); +#endif + return str; + } } } diff --git a/test/Serilog.Settings.Configuration.Tests/Support/JsonStringConfigSource.cs b/test/Serilog.Settings.Configuration.Tests/Support/JsonStringConfigSource.cs index 31cf8ac..0fac6ab 100644 --- a/test/Serilog.Settings.Configuration.Tests/Support/JsonStringConfigSource.cs +++ b/test/Serilog.Settings.Configuration.Tests/Support/JsonStringConfigSource.cs @@ -45,7 +45,7 @@ public JsonStringConfigProvider(string json) : base(new JsonConfigurationSource public override void Load() { - Load(StringToStream(_json)); + Load(StringToStream(_json.Fix())); } static Stream StringToStream(string str) diff --git a/test/TestDummies/DummyLoggerConfigurationExtensions.cs b/test/TestDummies/DummyLoggerConfigurationExtensions.cs index ecae9cd..7c1d109 100644 --- a/test/TestDummies/DummyLoggerConfigurationExtensions.cs +++ b/test/TestDummies/DummyLoggerConfigurationExtensions.cs @@ -1,13 +1,13 @@ -using System; +using Microsoft.Extensions.Configuration; using Serilog; -using Serilog.Events; -using Serilog.Formatting; using Serilog.Configuration; using Serilog.Core; +using Serilog.Events; +using Serilog.Formatting; +using System; +using System.Collections.Generic; using TestDummies.Console; using TestDummies.Console.Themes; -using Microsoft.Extensions.Configuration; -using System.Collections.Generic; namespace TestDummies { @@ -63,13 +63,20 @@ public static LoggerConfiguration DummyWithConfigSection( public static LoggerConfiguration DummyRollingFile( this LoggerSinkConfiguration loggerSinkConfiguration, - List objectBinding, + List objectBinding, string pathFormat, LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum) { return loggerSinkConfiguration.Sink(new DummyRollingFileSink(), restrictedToMinimumLevel); } + public class Binding + { + public string Foo { get; set; } + + public string Abc { get; set; } + } + public static LoggerConfiguration DummyRollingFile( this LoggerSinkConfiguration loggerSinkConfiguration, string[] stringArrayBinding, @@ -133,5 +140,21 @@ string hardCodedString return loggerDestructuringConfiguration.With(new DummyHardCodedStringDestructuringPolicy(hardCodedString)); } + public static LoggerConfiguration DummyArrayOfType(this LoggerDestructuringConfiguration loggerSinkConfiguration, + List list, + Type[] array = null, + Type type = null, + CustomCollection custom = null, + CustomCollection customString = null) + { + return loggerSinkConfiguration.With(DummyPolicy.Current = new DummyPolicy + { + List = list, + Array = array, + Type = type, + Custom = custom, + CustomStrings = customString, + }); + } } } diff --git a/test/TestDummies/DummyPolicy.cs b/test/TestDummies/DummyPolicy.cs new file mode 100644 index 0000000..ada4c2f --- /dev/null +++ b/test/TestDummies/DummyPolicy.cs @@ -0,0 +1,48 @@ +using Serilog.Core; +using Serilog.Events; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace TestDummies +{ + public class DummyPolicy : IDestructuringPolicy + { + public static DummyPolicy Current { get; set; } + + public Type[] Array { get; set; } + + public List List { get; set; } + + public CustomCollection Custom { get; set; } + + public CustomCollection CustomStrings { get; set; } + + public Type Type { get; set; } + + public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, out LogEventPropertyValue result) + { + result = null; + return false; + } + } + + public class CustomCollection : IEnumerable + { + private readonly List inner = new List(); + + public void Add(T item) => inner.Add(item); + + // wrong signature for collection initializer + public int Add() => 0; + + // wrong signature for collection initializer + public void Add(string a, byte b) { } + + public T First => inner.Count > 0 ? inner[0] : default; + + public IEnumerator GetEnumerator() => inner.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => inner.GetEnumerator(); + } +} diff --git a/test/TestDummies/TestDummies.csproj b/test/TestDummies/TestDummies.csproj index 5c212f5..b6be4b2 100644 --- a/test/TestDummies/TestDummies.csproj +++ b/test/TestDummies/TestDummies.csproj @@ -1,7 +1,8 @@  - net452;netstandard2.0 + latest + net451;net452;netstandard2.0 TestDummies ../../assets/Serilog.snk true @@ -20,10 +21,10 @@ - + - + From 63efc49dae281edc5320a17d7f4ab7565ccb1e6b Mon Sep 17 00:00:00 2001 From: Ivan Maximov Date: Tue, 19 Nov 2019 22:48:11 +0300 Subject: [PATCH 5/5] remove parens --- .../Serilog.Settings.Configuration.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index bd1907e..92b336d 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -36,7 +36,7 @@ - +