diff --git a/Directory.Build.props b/Directory.Build.props
index 031340d..736814b 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -6,5 +6,6 @@
$(MSBuildThisFileDirectory)assets/Serilog.snk
enable
false
+ enable
diff --git a/sample/Sample/Program.cs b/sample/Sample/Program.cs
index d2888aa..ae2422c 100644
--- a/sample/Sample/Program.cs
+++ b/sample/Sample/Program.cs
@@ -73,14 +73,14 @@ public bool IsEnabled(LogEvent logEvent)
public class LoginData
{
- public string Username;
+ public string? Username;
// ReSharper disable once NotAccessedField.Global
- public string Password;
+ public string? Password;
}
public class CustomPolicy : IDestructuringPolicy
{
- public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, out LogEventPropertyValue result)
+ public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, out LogEventPropertyValue? result)
{
result = null;
diff --git a/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs b/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs
index b4ce091..2282b1b 100644
--- a/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs
+++ b/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs
@@ -47,7 +47,7 @@ public static class ConfigurationLoggerConfigurationExtensions
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
string sectionName,
- DependencyContext dependencyContext = null)
+ DependencyContext? dependencyContext = null)
{
if (settingConfiguration == null) throw new ArgumentNullException(nameof(settingConfiguration));
if (configuration == null) throw new ArgumentNullException(nameof(configuration));
@@ -87,7 +87,7 @@ public static class ConfigurationLoggerConfigurationExtensions
public static LoggerConfiguration ConfigurationSection(
this LoggerSettingsConfiguration settingConfiguration,
IConfigurationSection configSection,
- DependencyContext dependencyContext = null)
+ DependencyContext? dependencyContext = null)
{
if (settingConfiguration == null) throw new ArgumentNullException(nameof(settingConfiguration));
if (configSection == null) throw new ArgumentNullException(nameof(configSection));
@@ -214,7 +214,7 @@ public static class ConfigurationLoggerConfigurationExtensions
public static LoggerConfiguration Configuration(
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
- ConfigurationReaderOptions readerOptions = null)
+ ConfigurationReaderOptions? readerOptions = null)
{
var configurationReader = readerOptions switch
{
@@ -225,7 +225,7 @@ public static class ConfigurationLoggerConfigurationExtensions
return settingConfiguration.Settings(configurationReader);
}
- static ConfigurationReader GetConfigurationReader(IConfiguration configuration, ConfigurationReaderOptions readerOptions, DependencyContext dependencyContext)
+ static ConfigurationReader GetConfigurationReader(IConfiguration configuration, ConfigurationReaderOptions readerOptions, DependencyContext? dependencyContext)
{
var assemblyFinder = dependencyContext == null ? AssemblyFinder.Auto() : AssemblyFinder.ForDependencyContext(dependencyContext);
var section = string.IsNullOrWhiteSpace(readerOptions.SectionName) ? configuration : configuration.GetSection(readerOptions.SectionName);
diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs
index 4d7570c..e571157 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs
@@ -46,7 +46,7 @@ where IsCaseInsensitiveMatch(assemblyFileName, nameToFind)
return query.ToList().AsReadOnly();
- static 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 8d16635..b9f5ddc 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs
@@ -20,9 +20,9 @@ class ConfigurationReader : IConfigurationReader
readonly IConfiguration _section;
readonly IReadOnlyCollection _configurationAssemblies;
readonly ResolutionContext _resolutionContext;
- readonly IConfigurationRoot _configurationRoot;
+ readonly IConfigurationRoot? _configurationRoot;
- public ConfigurationReader(IConfiguration configSection, AssemblyFinder assemblyFinder, ConfigurationReaderOptions readerOptions, IConfiguration configuration = null)
+ public ConfigurationReader(IConfiguration configSection, AssemblyFinder assemblyFinder, ConfigurationReaderOptions readerOptions, IConfiguration? configuration = null)
{
_section = configSection ?? throw new ArgumentNullException(nameof(configSection));
_configurationAssemblies = LoadConfigurationAssemblies(_section, assemblyFinder);
@@ -145,8 +145,8 @@ void ApplyMinimumLevel(LoggerConfiguration loggerConfiguration)
{
var minimumLevelDirective = _section.GetSection("MinimumLevel");
- IConfigurationSection defaultMinLevelDirective = GetDefaultMinLevelDirective();
- if (defaultMinLevelDirective.Value != null)
+ IConfigurationSection? defaultMinLevelDirective = GetDefaultMinLevelDirective();
+ if (defaultMinLevelDirective?.Value != null)
{
ApplyMinimumLevelConfiguration(defaultMinLevelDirective, (configuration, levelSwitch) => configuration.ControlledBy(levelSwitch));
}
@@ -189,7 +189,7 @@ void ApplyMinimumLevelConfiguration(IConfigurationSection directive, Action candidateMethods, string name, IReadOnlyCollection suppliedArgumentNames)
+ internal static MethodInfo? SelectConfigurationMethod(IReadOnlyCollection candidateMethods, string name, IReadOnlyCollection suppliedArgumentNames)
{
// Per issue #111, it is safe to use case-insensitive matching on argument names. The CLR doesn't permit this type
// of overloading, and the Microsoft.Extensions.Configuration keys are case-insensitive (case is preserved with some
diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReaderOptions.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReaderOptions.cs
index 7fa22a5..3956cf0 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReaderOptions.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReaderOptions.cs
@@ -38,7 +38,7 @@ public ConfigurationReaderOptions() : this(dependencyContext: null)
/// The dependency context from which sink/enricher packages can be located. If , the platform default will be used.
///
/// Prefer the constructor taking explicit assemblies: . It's the only one supporting single-file publishing.
- public ConfigurationReaderOptions(DependencyContext dependencyContext) => DependencyContext = dependencyContext;
+ public ConfigurationReaderOptions(DependencyContext? dependencyContext) => DependencyContext = dependencyContext;
///
/// Initialize a new instance of the class.
@@ -50,12 +50,12 @@ public ConfigurationReaderOptions() : this(dependencyContext: null)
///
/// The section name for section which contains a Serilog section. Defaults to Serilog.
///
- public string SectionName { get; init; } = ConfigurationLoggerConfigurationExtensions.DefaultSectionName;
+ public string? SectionName { get; init; } = ConfigurationLoggerConfigurationExtensions.DefaultSectionName;
///
/// The used when converting strings to other object types. Defaults to the invariant culture.
///
- public IFormatProvider FormatProvider { get; init; } = CultureInfo.InvariantCulture;
+ public IFormatProvider? FormatProvider { get; init; } = CultureInfo.InvariantCulture;
///
/// Called when a log level switch is created while reading the configuration.
@@ -65,9 +65,9 @@ public ConfigurationReaderOptions() : this(dependencyContext: null)
/// - For minimum level override switches, the switch name is the (partial) namespace or type name of the override.
///
///
- public Action OnLevelSwitchCreated { get; init; }
+ public Action? OnLevelSwitchCreated { get; init; }
- internal Assembly[] Assemblies { get; }
- internal DependencyContext DependencyContext { get; }
+ internal Assembly[]? Assemblies { get; }
+ internal DependencyContext? DependencyContext { get; }
internal ConfigurationAssemblySource? ConfigurationAssemblySource { get; }
}
diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/IConfigurationArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/IConfigurationArgumentValue.cs
index d39015c..8a1e86f 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/IConfigurationArgumentValue.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/IConfigurationArgumentValue.cs
@@ -2,5 +2,5 @@
interface IConfigurationArgumentValue
{
- object ConvertTo(Type toType, ResolutionContext resolutionContext);
+ object? ConvertTo(Type toType, ResolutionContext resolutionContext);
}
diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/LoggingFilterSwitchProxy.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/LoggingFilterSwitchProxy.cs
index a35d6b1..a35974e 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/LoggingFilterSwitchProxy.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/LoggingFilterSwitchProxy.cs
@@ -2,8 +2,8 @@
class LoggingFilterSwitchProxy
{
- readonly Action _setProxy;
- readonly Func _getProxy;
+ readonly Action _setProxy;
+ readonly Func _getProxy;
LoggingFilterSwitchProxy(object realSwitch)
{
@@ -12,26 +12,26 @@ class LoggingFilterSwitchProxy
var type = realSwitch.GetType();
var expressionProperty = type.GetProperty("Expression") ?? throw new MissingMemberException(type.FullName, "Expression");
- _setProxy = (Action)Delegate.CreateDelegate(
- typeof(Action),
+ _setProxy = (Action)Delegate.CreateDelegate(
+ typeof(Action),
realSwitch,
expressionProperty.GetSetMethod());
- _getProxy = (Func)Delegate.CreateDelegate(
- typeof(Func),
+ _getProxy = (Func)Delegate.CreateDelegate(
+ typeof(Func),
realSwitch,
expressionProperty.GetGetMethod());
}
public object RealSwitch { get; }
- public string Expression
+ public string? Expression
{
get => _getProxy();
set => _setProxy(value);
}
- public static LoggingFilterSwitchProxy Create(string expression = null)
+ public static LoggingFilterSwitchProxy? Create(string? expression = null)
{
var filterSwitchType =
Type.GetType("Serilog.Expressions.LoggingFilterSwitch, Serilog.Expressions") ??
diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs
index 87d8ace..6cc07b4 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs
@@ -1,3 +1,4 @@
+using System.Diagnostics.CodeAnalysis;
using System.Linq.Expressions;
using System.Reflection;
@@ -20,7 +21,7 @@ public ObjectArgumentValue(IConfigurationSection section, IReadOnlyCollection new { success = true, hasMatch = true, value = (object)argValue },
+ true => new { success = true, hasMatch = true, value = (object?)argValue },
false => p.HasDefaultValue switch
{
- true => new { success = true, hasMatch = false, value = p.DefaultValue },
- false => new { success = false, hasMatch = false, value = (object)null },
+ true => new { success = true, hasMatch = false, value = (object?)p.DefaultValue },
+ false => new { success = false, hasMatch = false, value = (object?)null },
},
}
group new { argumentBindResult, p.ParameterType } by c into gr
@@ -178,7 +179,7 @@ select new
ctorExpression = Expression.New(ctor.ConstructorInfo, ctorArguments);
return true;
- static bool TryBindToCtorArgument(object value, Type type, ResolutionContext resolutionContext, out Expression argumentExpression)
+ static bool TryBindToCtorArgument(object value, Type type, ResolutionContext resolutionContext, [NotNullWhen(true)] out Expression? argumentExpression)
{
argumentExpression = null;
@@ -217,7 +218,7 @@ static bool TryBindToCtorArgument(object value, Type type, ResolutionContext res
}
}
- static bool IsContainer(Type type, out Type elementType)
+ static bool IsContainer(Type type, [NotNullWhen(true)] out Type? elementType)
{
elementType = null;
foreach (var iface in type.GetInterfaces())
diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ResolutionContext.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ResolutionContext.cs
index d0fdf40..d002620 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/ResolutionContext.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ResolutionContext.cs
@@ -11,9 +11,9 @@ sealed class ResolutionContext
{
readonly IDictionary _declaredLevelSwitches;
readonly IDictionary _declaredFilterSwitches;
- readonly IConfiguration _appConfiguration;
+ readonly IConfiguration? _appConfiguration;
- public ResolutionContext(IConfiguration appConfiguration = null, ConfigurationReaderOptions readerOptions = null)
+ public ResolutionContext(IConfiguration? appConfiguration = null, ConfigurationReaderOptions? readerOptions = null)
{
_declaredLevelSwitches = new Dictionary();
_declaredFilterSwitches = new Dictionary();
@@ -51,18 +51,7 @@ public LoggingFilterSwitchProxy LookUpFilterSwitchByName(string switchName)
public bool HasAppConfiguration => _appConfiguration != null;
- public IConfiguration AppConfiguration
- {
- get
- {
- if (!HasAppConfiguration)
- {
- throw new InvalidOperationException("AppConfiguration is not available");
- }
-
- return _appConfiguration;
- }
- }
+ public IConfiguration AppConfiguration => _appConfiguration ?? throw new InvalidOperationException("AppConfiguration is not available");
public string AddLevelSwitch(string levelSwitchName, LoggingLevelSwitch levelSwitch)
{
diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs
index ab437eb..2c87b27 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs
@@ -1,4 +1,5 @@
-using System.Reflection;
+using System.Diagnostics.CodeAnalysis;
+using System.Reflection;
using System.Text.RegularExpressions;
using Serilog.Core;
@@ -23,7 +24,7 @@ public StringArgumentValue(string providedValue)
{ typeof(Type), s => Type.GetType(s, throwOnError:true) },
};
- public object ConvertTo(Type toType, ResolutionContext resolutionContext)
+ public object? ConvertTo(Type toType, ResolutionContext resolutionContext)
{
var argumentValue = Environment.ExpandEnvironmentVariables(_providedValue);
@@ -158,7 +159,7 @@ public object ConvertTo(Type toType, ResolutionContext resolutionContext)
return Convert.ChangeType(argumentValue, toType, resolutionContext.ReaderOptions.FormatProvider);
}
- internal static Type FindType(string typeName)
+ internal static Type? FindType(string typeName)
{
var type = Type.GetType(typeName);
if (type == null)
@@ -172,7 +173,7 @@ internal static Type FindType(string typeName)
return type;
}
- internal static bool TryParseStaticMemberAccessor(string input, out string accessorTypeName, out string memberName)
+ internal static bool TryParseStaticMemberAccessor(string input, [NotNullWhen(true)] out string? accessorTypeName, [NotNullWhen(true)] out string? memberName)
{
if (input == null)
{
diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/SurrogateConfigurationMethods.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/SurrogateConfigurationMethods.cs
index cbc2869..b758d7c 100644
--- a/src/Serilog.Settings.Configuration/Settings/Configuration/SurrogateConfigurationMethods.cs
+++ b/src/Serilog.Settings.Configuration/Settings/Configuration/SurrogateConfigurationMethods.cs
@@ -45,14 +45,14 @@ static class SurrogateConfigurationMethods
LoggerSinkConfiguration loggerSinkConfiguration,
ILogEventSink sink,
LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
- LoggingLevelSwitch levelSwitch = null)
+ LoggingLevelSwitch? levelSwitch = null)
=> loggerSinkConfiguration.Sink(sink, restrictedToMinimumLevel, levelSwitch);
static LoggerConfiguration Logger(
LoggerSinkConfiguration loggerSinkConfiguration,
Action configureLogger,
LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
- LoggingLevelSwitch levelSwitch = null)
+ LoggingLevelSwitch? levelSwitch = null)
=> loggerSinkConfiguration.Logger(configureLogger, restrictedToMinimumLevel, levelSwitch);
// .AuditTo...
@@ -61,14 +61,14 @@ static class SurrogateConfigurationMethods
LoggerAuditSinkConfiguration auditSinkConfiguration,
ILogEventSink sink,
LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
- LoggingLevelSwitch levelSwitch = null)
+ LoggingLevelSwitch? levelSwitch = null)
=> auditSinkConfiguration.Sink(sink, restrictedToMinimumLevel, levelSwitch);
static LoggerConfiguration Logger(
LoggerAuditSinkConfiguration auditSinkConfiguration,
Action configureLogger,
LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
- LoggingLevelSwitch levelSwitch = null)
+ LoggingLevelSwitch? levelSwitch = null)
=> auditSinkConfiguration.Logger(configureLogger, restrictedToMinimumLevel, levelSwitch);
// .Filter...
@@ -109,7 +109,7 @@ static LoggerConfiguration AsScalar(LoggerDestructuringConfiguration loggerDestr
LoggerEnrichmentConfiguration loggerEnrichmentConfiguration,
Action configureEnricher,
LogEventLevel enrichFromLevel = LevelAlias.Minimum,
- LoggingLevelSwitch levelSwitch = null)
+ LoggingLevelSwitch? levelSwitch = null)
=> levelSwitch != null ? loggerEnrichmentConfiguration.AtLevel(levelSwitch, configureEnricher)
: loggerEnrichmentConfiguration.AtLevel(enrichFromLevel, configureEnricher);
diff --git a/test/Serilog.Settings.Configuration.Tests/ConfigurationReaderTests.cs b/test/Serilog.Settings.Configuration.Tests/ConfigurationReaderTests.cs
index 87b7067..0f8ae95 100644
--- a/test/Serilog.Settings.Configuration.Tests/ConfigurationReaderTests.cs
+++ b/test/Serilog.Settings.Configuration.Tests/ConfigurationReaderTests.cs
@@ -154,7 +154,7 @@ public void CallableMethodsAreSelected()
var suppliedArgumentNames = new[] { "pathFormat" };
var selected = ConfigurationReader.SelectConfigurationMethod(options, "DummyRollingFile", suppliedArgumentNames);
- Assert.Equal(typeof(string), selected.GetParameters()[1].ParameterType);
+ Assert.Equal(typeof(string), selected?.GetParameters()[1].ParameterType);
}
[Fact]
@@ -166,7 +166,7 @@ public void MethodsAreSelectedBasedOnCountOfMatchedArguments()
var suppliedArgumentNames = new[] { "pathFormat", "formatter" };
var selected = ConfigurationReader.SelectConfigurationMethod(options, "DummyRollingFile", suppliedArgumentNames);
- Assert.Equal(typeof(ITextFormatter), selected.GetParameters()[1].ParameterType);
+ Assert.Equal(typeof(ITextFormatter), selected?.GetParameters()[1].ParameterType);
}
[Fact]
@@ -178,7 +178,7 @@ public void MethodsAreSelectedBasedOnCountOfMatchedArgumentsAndThenStringType()
var suppliedArgumentNames = new[] { "pathFormat", "formatter" };
var selected = ConfigurationReader.SelectConfigurationMethod(options, "DummyRollingFile", suppliedArgumentNames);
- Assert.Equal(typeof(string), selected.GetParameters()[2].ParameterType);
+ Assert.Equal(typeof(string), selected?.GetParameters()[2].ParameterType);
}
public static IEnumerable