Skip to content

Commit 4424523

Browse files
author
Sergey Komisarchik
committed
filtering support
1 parent 5266181 commit 4424523

File tree

1 file changed

+36
-8
lines changed

1 file changed

+36
-8
lines changed

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

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Serilog.Core;
1212
using Serilog.Debugging;
1313
using Serilog.Events;
14+
using System.Linq.Expressions;
1415

1516
namespace Serilog.Settings.Configuration
1617
{
@@ -33,9 +34,20 @@ public void Configure(LoggerConfiguration loggerConfiguration)
3334

3435
ApplyMinimumLevel(loggerConfiguration);
3536
ApplyEnrichment(loggerConfiguration, configurationAssemblies);
37+
ApplyFilters(loggerConfiguration, configurationAssemblies);
3638
ApplySinks(loggerConfiguration, configurationAssemblies);
3739
}
3840

41+
void ApplyFilters(LoggerConfiguration loggerConfiguration, Assembly[] configurationAssemblies)
42+
{
43+
var filterDirective = _configuration.GetSection("Filter");
44+
if (filterDirective != null)
45+
{
46+
var methodCalls = GetMethodCalls(filterDirective);
47+
CallConfigurationMethods(methodCalls, FindFilterConfigurationMethods(configurationAssemblies), loggerConfiguration.Filter);
48+
}
49+
}
50+
3951
void ApplySinks(LoggerConfiguration loggerConfiguration, Assembly[] configurationAssemblies)
4052
{
4153
var writeToDirective = _configuration.GetSection("WriteTo");
@@ -273,21 +285,20 @@ internal static IList<MethodInfo> FindSinkConfigurationMethods(IEnumerable<Assem
273285
return FindConfigurationMethods(configurationAssemblies, typeof(LoggerSinkConfiguration));
274286
}
275287

276-
// Unlike the other configuration methods, FromLogContext is an instance method rather than an extension.
277-
internal static LoggerConfiguration FromLogContext(LoggerEnrichmentConfiguration loggerEnrichmentConfiguration)
288+
internal static IList<MethodInfo> FindFilterConfigurationMethods(IEnumerable<Assembly> configurationAssemblies)
278289
{
279-
return loggerEnrichmentConfiguration.FromLogContext();
280-
}
290+
var found = FindConfigurationMethods(configurationAssemblies, typeof(LoggerFilterConfiguration));
291+
if (configurationAssemblies.Contains(typeof(LoggerFilterConfiguration).GetTypeInfo().Assembly))
292+
found.Add(GetSurrogateConfigurationMethod<LoggerFilterConfiguration, ILogEventFilter>((c, f) => With(c, f)));
281293

282-
static readonly MethodInfo SurrogateFromLogContextConfigurationMethod = typeof(ConfigurationReader)
283-
.GetTypeInfo()
284-
.DeclaredMethods.Single(m => m.Name == "FromLogContext");
294+
return found;
295+
}
285296

286297
internal static IList<MethodInfo> FindEventEnricherConfigurationMethods(IEnumerable<Assembly> configurationAssemblies)
287298
{
288299
var found = FindConfigurationMethods(configurationAssemblies, typeof(LoggerEnrichmentConfiguration));
289300
if (configurationAssemblies.Contains(typeof(LoggerEnrichmentConfiguration).GetTypeInfo().Assembly))
290-
found.Add(SurrogateFromLogContextConfigurationMethod);
301+
found.Add(GetSurrogateConfigurationMethod<LoggerEnrichmentConfiguration, object>((c, _) => FromLogContext(c)));
291302

292303
return found;
293304
}
@@ -303,5 +314,22 @@ internal static IList<MethodInfo> FindConfigurationMethods(IEnumerable<Assembly>
303314
.Where(m => m.GetParameters()[0].ParameterType == configType)
304315
.ToList();
305316
}
317+
318+
// don't support (yet?) arrays in the parameter list (ILogEventEnricher[])
319+
internal static LoggerConfiguration With(LoggerFilterConfiguration loggerFilterConfiguration, ILogEventFilter filter)
320+
{
321+
return loggerFilterConfiguration.With(filter);
322+
}
323+
324+
// Unlike the other configuration methods, FromLogContext is an instance method rather than an extension.
325+
internal static LoggerConfiguration FromLogContext(LoggerEnrichmentConfiguration loggerEnrichmentConfiguration)
326+
{
327+
return loggerEnrichmentConfiguration.FromLogContext();
328+
}
329+
330+
internal static MethodInfo GetSurrogateConfigurationMethod<TConfiguration, TArg>(Expression<Action<TConfiguration, TArg>> method)
331+
{
332+
return (method.Body as MethodCallExpression)?.Method;
333+
}
306334
}
307335
}

0 commit comments

Comments
 (0)