Skip to content

Commit 82b8147

Browse files
authored
Merge pull request #36 from skomis-mm/filter
Filter support
2 parents 9b5b948 + 4f90292 commit 82b8147

File tree

4 files changed

+62
-10
lines changed

4 files changed

+62
-10
lines changed

sample/Sample/Program.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.IO;
66

77
using Serilog.Core;
8+
using Serilog.Events;
89

910
namespace Sample
1011
{
@@ -32,4 +33,12 @@ public static void Main(string[] args)
3233
while (Console.ReadKey().KeyChar != 'q');
3334
}
3435
}
36+
37+
public class CustomFilter : ILogEventFilter
38+
{
39+
public bool IsEnabled(LogEvent logEvent)
40+
{
41+
return true;
42+
}
43+
}
3544
}

sample/Sample/appsettings.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,20 @@
2626
"Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"],
2727
"Properties": {
2828
"Application": "Sample"
29-
}
29+
},
30+
"Filter": [
31+
{
32+
"Name": "ByIncludingOnly",
33+
"Args": {
34+
"expression": "Application = 'Sample'"
35+
}
36+
},
37+
{
38+
"Name": "With",
39+
"Args": {
40+
"filter": "Sample.CustomFilter, Sample"
41+
}
42+
}
43+
]
3044
}
3145
}

sample/Sample/project.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"Serilog.Sinks.Literate": "2.0.0",
1010
"Serilog.Sinks.RollingFile": "3.0.0",
1111
"Serilog.Enrichers.Environment": "2.0.0",
12-
"Serilog.Enrichers.Thread": "2.0.0"
12+
"Serilog.Enrichers.Thread": "2.0.0",
13+
"Serilog.Filters.Expressions": "1.0.0-*"
1314
},
1415
"frameworks": {
1516
"net4.6": {

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)