Skip to content

Commit 6c1e28f

Browse files
authored
Merge pull request #87 from tsimbalar/auditto
Support AuditTo in configuration
2 parents c342d12 + 190e1a9 commit 6c1e28f

23 files changed

+686
-5
lines changed

serilog-settings-configuration.sln

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio 15
4-
VisualStudioVersion = 15.0.26228.10
4+
VisualStudioVersion = 15.0.27130.0
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{4E41FD57-5FAB-4E3C-B16E-463DE98338BC}"
77
EndProject
@@ -24,6 +24,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serilog.Settings.Configurat
2424
EndProject
2525
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample", "sample\Sample\Sample.csproj", "{A00E5E32-54F9-401A-BBA1-2F6FCB6366CD}"
2626
EndProject
27+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDummies", "test\TestDummies\TestDummies.csproj", "{B7CF5068-DD19-4868-A268-5280BDE90361}"
28+
EndProject
2729
Global
2830
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2931
Debug|Any CPU = Debug|Any CPU
@@ -42,6 +44,10 @@ Global
4244
{A00E5E32-54F9-401A-BBA1-2F6FCB6366CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
4345
{A00E5E32-54F9-401A-BBA1-2F6FCB6366CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
4446
{A00E5E32-54F9-401A-BBA1-2F6FCB6366CD}.Release|Any CPU.Build.0 = Release|Any CPU
47+
{B7CF5068-DD19-4868-A268-5280BDE90361}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
48+
{B7CF5068-DD19-4868-A268-5280BDE90361}.Debug|Any CPU.Build.0 = Debug|Any CPU
49+
{B7CF5068-DD19-4868-A268-5280BDE90361}.Release|Any CPU.ActiveCfg = Release|Any CPU
50+
{B7CF5068-DD19-4868-A268-5280BDE90361}.Release|Any CPU.Build.0 = Release|Any CPU
4551
EndGlobalSection
4652
GlobalSection(SolutionProperties) = preSolution
4753
HideSolutionNode = FALSE
@@ -50,5 +56,9 @@ Global
5056
{21FF98ED-E68C-4A67-B241-C8D6122FAD7D} = {4E41FD57-5FAB-4E3C-B16E-463DE98338BC}
5157
{F793C6E8-C40A-4018-8884-C97E2BE38A54} = {D551DCB0-7771-4D01-BEBD-F7B57D1CF0E3}
5258
{A00E5E32-54F9-401A-BBA1-2F6FCB6366CD} = {D24872B9-57F3-42A7-BC8D-F9DA222FCE1B}
59+
{B7CF5068-DD19-4868-A268-5280BDE90361} = {D551DCB0-7771-4D01-BEBD-F7B57D1CF0E3}
60+
EndGlobalSection
61+
GlobalSection(ExtensibilityGlobals) = postSolution
62+
SolutionGuid = {485F8843-42D7-4267-B5FB-20FE9181DEE9}
5363
EndGlobalSection
5464
EndGlobal

src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,20 @@
1313
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
1414
<PackageId>Serilog.Settings.Configuration</PackageId>
1515
<PackageTags>serilog;json</PackageTags>
16-
<PackageIconUrl>http://serilog.net/images/serilog-configuration-nuget.png</PackageIconUrl>
17-
<PackageProjectUrl>http://serilog.net</PackageProjectUrl>
18-
<PackageLicenseUrl>http://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl>
16+
<PackageIconUrl>https://serilog.net/images/serilog-configuration-nuget.png</PackageIconUrl>
17+
<PackageProjectUrl>https://github.com/serilog/serilog-settings-configuration</PackageProjectUrl>
18+
<PackageLicenseUrl>https://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl>
1919

2020
<!-- Don't reference the full NETStandard.Library -->
2121
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
22+
<RootNamespace>Serilog</RootNamespace>
23+
<Version>2.5.0</Version>
2224
</PropertyGroup>
2325

2426
<ItemGroup>
2527
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="1.0.0" />
2628
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="1.0.0" />
27-
<PackageReference Include="Serilog" Version="2.0.0" />
29+
<PackageReference Include="Serilog" Version="2.6.0" />
2830
</ItemGroup>
2931

3032
<PropertyGroup Condition=" '$(TargetFramework)' == 'net451' ">

src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public void Configure(LoggerConfiguration loggerConfiguration)
4141
ApplyEnrichment(loggerConfiguration);
4242
ApplyFilters(loggerConfiguration);
4343
ApplySinks(loggerConfiguration);
44+
ApplyAuditSinks(loggerConfiguration);
4445
}
4546

4647
void ApplyMinimumLevel(LoggerConfiguration loggerConfiguration)
@@ -98,6 +99,16 @@ void ApplySinks(LoggerConfiguration loggerConfiguration)
9899
}
99100
}
100101

102+
void ApplyAuditSinks(LoggerConfiguration loggerConfiguration)
103+
{
104+
var auditToDirective = _configuration.GetSection("AuditTo");
105+
if (auditToDirective != null)
106+
{
107+
var methodCalls = GetMethodCalls(auditToDirective);
108+
CallConfigurationMethods(methodCalls, FindAuditSinkConfigurationMethods(_configurationAssemblies), loggerConfiguration.AuditTo);
109+
}
110+
}
111+
101112
void IConfigurationReader.ApplySinks(LoggerSinkConfiguration loggerSinkConfiguration)
102113
{
103114
var methodCalls = GetMethodCalls(_configuration);
@@ -260,6 +271,13 @@ internal static IList<MethodInfo> FindSinkConfigurationMethods(IEnumerable<Assem
260271
return found;
261272
}
262273

274+
internal static IList<MethodInfo> FindAuditSinkConfigurationMethods(IEnumerable<Assembly> configurationAssemblies)
275+
{
276+
var found = FindConfigurationMethods(configurationAssemblies, typeof(LoggerAuditSinkConfiguration));
277+
278+
return found;
279+
}
280+
263281
internal static IList<MethodInfo> FindFilterConfigurationMethods(IEnumerable<Assembly> configurationAssemblies)
264282
{
265283
var found = FindConfigurationMethods(configurationAssemblies, typeof(LoggerFilterConfiguration));
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
using System;
2+
using Microsoft.Extensions.Configuration;
3+
using Serilog.Events;
4+
using Serilog.Settings.Configuration.Tests.Support;
5+
using TestDummies;
6+
using TestDummies.Console;
7+
using TestDummies.Console.Themes;
8+
using Xunit;
9+
10+
namespace Serilog.Settings.Configuration.Tests
11+
{
12+
public class ConfigurationSettingsTests
13+
{
14+
private static LoggerConfiguration ConfigFromJson(string jsonString)
15+
{
16+
var config = new ConfigurationBuilder().AddJsonString(jsonString).Build();
17+
return new LoggerConfiguration()
18+
.ReadFrom.Configuration(config);
19+
}
20+
21+
[Fact]
22+
public void PropertyEnrichmentIsApplied()
23+
{
24+
LogEvent evt = null;
25+
26+
var json = @"{
27+
""Serilog"": {
28+
""Properties"": {
29+
""App"": ""Test""
30+
}
31+
}
32+
}";
33+
34+
var log = ConfigFromJson(json)
35+
.WriteTo.Sink(new DelegatingSink(e => evt = e))
36+
.CreateLogger();
37+
38+
log.Information("Has a test property");
39+
40+
Assert.NotNull(evt);
41+
Assert.Equal("Test", evt.Properties["App"].LiteralValue());
42+
}
43+
44+
[Theory]
45+
[InlineData("extended syntax",
46+
@"{
47+
""Serilog"": {
48+
""Using"": [""TestDummies""],
49+
""WriteTo"": [
50+
{ ""Name"": ""DummyConsole""},
51+
{ ""Name"": ""DummyWithLevelSwitch""},
52+
]
53+
}
54+
}")]
55+
[InlineData("simplified syntax",
56+
@"{
57+
""Serilog"": {
58+
""Using"": [""TestDummies""],
59+
""WriteTo"": [""DummyConsole"", ""DummyWithLevelSwitch"" ]
60+
}
61+
}")]
62+
public void ParameterlessSinksAreConfigured(string syntax, string json)
63+
{
64+
var log = ConfigFromJson(json)
65+
.CreateLogger();
66+
67+
DummyConsoleSink.Emitted.Clear();
68+
DummyWithLevelSwitchSink.Emitted.Clear();
69+
70+
log.Write(Some.InformationEvent());
71+
72+
Assert.Equal(1, DummyConsoleSink.Emitted.Count);
73+
Assert.Equal(1, DummyWithLevelSwitchSink.Emitted.Count);
74+
}
75+
76+
[Fact]
77+
public void SinksAreConfigured()
78+
{
79+
var json = @"{
80+
""Serilog"": {
81+
""Using"": [""TestDummies""],
82+
""WriteTo"": [{
83+
""Name"": ""DummyRollingFile"",
84+
""Args"": {""pathFormat"" : ""C:\\""}
85+
}]
86+
}
87+
}";
88+
89+
var log = ConfigFromJson(json)
90+
.CreateLogger();
91+
92+
DummyRollingFileSink.Emitted.Clear();
93+
DummyRollingFileAuditSink.Emitted.Clear();
94+
95+
log.Write(Some.InformationEvent());
96+
97+
Assert.Equal(1, DummyRollingFileSink.Emitted.Count);
98+
Assert.Equal(0, DummyRollingFileAuditSink.Emitted.Count);
99+
}
100+
101+
[Fact]
102+
public void AuditSinksAreConfigured()
103+
{
104+
var json = @"{
105+
""Serilog"": {
106+
""Using"": [""TestDummies""],
107+
""AuditTo"": [{
108+
""Name"": ""DummyRollingFile"",
109+
""Args"": {""pathFormat"" : ""C:\\""}
110+
}]
111+
}
112+
}";
113+
114+
var log = ConfigFromJson(json)
115+
.CreateLogger();
116+
117+
DummyRollingFileSink.Emitted.Clear();
118+
DummyRollingFileAuditSink.Emitted.Clear();
119+
120+
log.Write(Some.InformationEvent());
121+
122+
Assert.Equal(0, DummyRollingFileSink.Emitted.Count);
123+
Assert.Equal(1, DummyRollingFileAuditSink.Emitted.Count);
124+
}
125+
126+
[Fact]
127+
public void TestMinimumLevelOverrides()
128+
{
129+
var json = @"{
130+
""Serilog"": {
131+
""MinimumLevel"" : {
132+
""Override"" : {
133+
""System"" : ""Warning""
134+
}
135+
}
136+
}
137+
}";
138+
139+
LogEvent evt = null;
140+
141+
var log = ConfigFromJson(json)
142+
.WriteTo.Sink(new DelegatingSink(e => evt = e))
143+
.CreateLogger();
144+
145+
var systemLogger = log.ForContext<WeakReference>();
146+
systemLogger.Write(Some.InformationEvent());
147+
148+
Assert.Null(evt);
149+
150+
systemLogger.Warning("Bad things");
151+
Assert.NotNull(evt);
152+
153+
evt = null;
154+
log.Write(Some.InformationEvent());
155+
Assert.NotNull(evt);
156+
}
157+
158+
[Fact]
159+
public void SinksWithAbstractParamsAreConfiguredWithTypeName()
160+
{
161+
var json = @"{
162+
""Serilog"": {
163+
""Using"": [""TestDummies""],
164+
""WriteTo"": [{
165+
""Name"": ""DummyConsole"",
166+
""Args"": {""theme"" : ""Serilog.Settings.Configuration.Tests.Support.CustomConsoleTheme, Serilog.Settings.Configuration.Tests""}
167+
}]
168+
}
169+
}";
170+
171+
DummyConsoleSink.Theme = null;
172+
173+
ConfigFromJson(json)
174+
.CreateLogger();
175+
176+
Assert.NotNull(DummyConsoleSink.Theme);
177+
Assert.IsType<CustomConsoleTheme>(DummyConsoleSink.Theme);
178+
}
179+
180+
[Fact]
181+
public void SinksAreConfiguredWithStaticMember()
182+
{
183+
var json = @"{
184+
""Serilog"": {
185+
""Using"": [""TestDummies""],
186+
""WriteTo"": [{
187+
""Name"": ""DummyConsole"",
188+
""Args"": {""theme"" : ""TestDummies.Console.Themes.ConsoleThemes::Theme1, TestDummies""}
189+
}]
190+
}
191+
}";
192+
193+
DummyConsoleSink.Theme = null;
194+
195+
ConfigFromJson(json)
196+
.CreateLogger();
197+
198+
Assert.Equal(ConsoleThemes.Theme1, DummyConsoleSink.Theme);
199+
}
200+
}
201+
}

test/Serilog.Settings.Configuration.Tests/Serilog.Settings.Configuration.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
<ItemGroup>
1212
<ProjectReference Include="..\..\src\Serilog.Settings.Configuration\Serilog.Settings.Configuration.csproj" />
13+
<ProjectReference Include="..\TestDummies\TestDummies.csproj" />
1314
</ItemGroup>
1415

1516
<ItemGroup>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Microsoft.Extensions.Configuration;
2+
3+
namespace Serilog.Settings.Configuration.Tests.Support
4+
{
5+
public static class ConfigurationBuilderExtensions
6+
{
7+
public static IConfigurationBuilder AddJsonString(this IConfigurationBuilder builder, string json)
8+
{
9+
return builder.Add(new JsonStringConfigSource(json));
10+
}
11+
}
12+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using TestDummies.Console.Themes;
2+
3+
namespace Serilog.Settings.Configuration.Tests.Support
4+
{
5+
class CustomConsoleTheme : ConsoleTheme
6+
{
7+
}
8+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using Serilog.Core;
3+
using Serilog.Events;
4+
5+
namespace Serilog.Settings.Configuration.Tests.Support
6+
{
7+
public class DelegatingSink : ILogEventSink
8+
{
9+
readonly Action<LogEvent> _write;
10+
11+
public DelegatingSink(Action<LogEvent> write)
12+
{
13+
if (write == null) throw new ArgumentNullException(nameof(write));
14+
_write = write;
15+
}
16+
17+
public void Emit(LogEvent logEvent)
18+
{
19+
_write(logEvent);
20+
}
21+
22+
public static LogEvent GetLogEvent(Action<ILogger> writeAction)
23+
{
24+
LogEvent result = null;
25+
var l = new LoggerConfiguration()
26+
.MinimumLevel.Verbose()
27+
.WriteTo.Sink(new DelegatingSink(le => result = le))
28+
.CreateLogger();
29+
30+
writeAction(l);
31+
return result;
32+
}
33+
}
34+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Serilog.Events;
2+
3+
namespace Serilog.Settings.Configuration.Tests.Support
4+
{
5+
public static class Extensions
6+
{
7+
public static object LiteralValue(this LogEventPropertyValue @this)
8+
{
9+
return ((ScalarValue)@this).Value;
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)