Skip to content

Commit 25cbf7b

Browse files
authored
Merge pull request #41 from serilog/dev
2.3.0 Release
2 parents 77d7e31 + aee6bb8 commit 25cbf7b

File tree

5 files changed

+71
-17
lines changed

5 files changed

+71
-17
lines changed

Diff for: sample/Sample/Program.cs

+9
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
}

Diff for: sample/Sample/appsettings.json

+15-1
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
}

Diff for: sample/Sample/project.json

+2-1
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": {

Diff for: src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs

+44-14
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");
@@ -156,31 +168,33 @@ Assembly[] LoadConfigurationAssemblies()
156168

157169
foreach (var assemblyName in GetSerilogConfigurationAssemblies())
158170
{
159-
var assumedName = new AssemblyName(assemblyName);
160-
var assumed = Assembly.Load(assumedName);
171+
var assumed = Assembly.Load(assemblyName);
161172
if (assumed != null && !assemblies.ContainsKey(assumed.FullName))
162173
assemblies.Add(assumed.FullName, assumed);
163174
}
164175

165176
return assemblies.Values.ToArray();
166177
}
167178

168-
string[] GetSerilogConfigurationAssemblies()
179+
AssemblyName[] GetSerilogConfigurationAssemblies()
169180
{
170-
var query = Enumerable.Empty<string>();
181+
var query = Enumerable.Empty<AssemblyName>();
171182
var filter = new Func<string, bool>(name => name != null && name.ToLowerInvariant().Contains("serilog"));
172183

173184
if (_dependencyContext != null)
174185
{
175-
query = from lib in _dependencyContext.RuntimeLibraries where filter(lib.Name) select lib.Name;
186+
query = from library in _dependencyContext.RuntimeLibraries
187+
from assemblyName in library.GetDefaultAssemblyNames(_dependencyContext)
188+
where filter(assemblyName.Name)
189+
select assemblyName;
176190
}
177191
else
178192
{
179193
#if APPDOMAIN
180194
query = from outputAssemblyPath in System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll")
181195
let assemblyFileName = System.IO.Path.GetFileNameWithoutExtension(outputAssemblyPath)
182196
where filter(assemblyFileName)
183-
select AssemblyName.GetAssemblyName(outputAssemblyPath).FullName;
197+
select AssemblyName.GetAssemblyName(outputAssemblyPath);
184198
#endif
185199
}
186200

@@ -273,21 +287,20 @@ internal static IList<MethodInfo> FindSinkConfigurationMethods(IEnumerable<Assem
273287
return FindConfigurationMethods(configurationAssemblies, typeof(LoggerSinkConfiguration));
274288
}
275289

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

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

286299
internal static IList<MethodInfo> FindEventEnricherConfigurationMethods(IEnumerable<Assembly> configurationAssemblies)
287300
{
288301
var found = FindConfigurationMethods(configurationAssemblies, typeof(LoggerEnrichmentConfiguration));
289302
if (configurationAssemblies.Contains(typeof(LoggerEnrichmentConfiguration).GetTypeInfo().Assembly))
290-
found.Add(SurrogateFromLogContextConfigurationMethod);
303+
found.Add(GetSurrogateConfigurationMethod<LoggerEnrichmentConfiguration, object>((c, _) => FromLogContext(c)));
291304

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

Diff for: src/Serilog.Settings.Configuration/project.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "2.2.0-*",
2+
"version": "2.3.0-*",
33
"description": "Microsoft.Extensions.Configuration (appsettings.json) support for Serilog.",
44
"authors": [ "Serilog Contributors" ],
55
"packOptions": {

0 commit comments

Comments
 (0)