Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Annotate Serilog.Settings.Configuration as not trim-compatible #371

Open
wants to merge 4 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyModel;
Expand Down Expand Up @@ -43,6 +44,8 @@ public static class ConfigurationLoggerConfigurationExtensions
/// default will be used.</param>
/// <returns>An object allowing configuration to continue.</returns>
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")]
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration Configuration(
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
Expand All @@ -68,6 +71,8 @@ public static LoggerConfiguration Configuration(
/// default will be used.</param>
/// <returns>An object allowing configuration to continue.</returns>
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")]
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration Configuration(
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
Expand All @@ -84,6 +89,8 @@ public static LoggerConfiguration Configuration(
/// default will be used.</param>
/// <returns>An object allowing configuration to continue.</returns>
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, string sectionName, DependencyContext dependencyContext) instead.")]
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration ConfigurationSection(
this LoggerSettingsConfiguration settingConfiguration,
IConfigurationSection configSection,
Expand Down Expand Up @@ -115,6 +122,8 @@ public static LoggerConfiguration ConfigurationSection(
/// <param name="configurationAssemblySource">Defines how the package identifies assemblies to scan for sinks and other types.</param>
/// <returns>An object allowing configuration to continue.</returns>
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")]
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration Configuration(
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
Expand All @@ -139,6 +148,8 @@ public static LoggerConfiguration Configuration(
/// <param name="configurationAssemblySource">Defines how the package identifies assemblies to scan for sinks and other types.</param>
/// <returns>An object allowing configuration to continue.</returns>
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")]
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration Configuration(
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
Expand All @@ -154,6 +165,8 @@ public static LoggerConfiguration Configuration(
/// <param name="configurationAssemblySource">Defines how the package identifies assemblies to scan for sinks and other types.</param>
/// <returns>An object allowing configuration to continue.</returns>
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, string sectionName, ConfigurationAssemblySource configurationAssemblySource) instead.")]
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration ConfigurationSection(
this LoggerSettingsConfiguration settingConfiguration,
IConfigurationSection configSection,
Expand All @@ -176,6 +189,8 @@ public static LoggerConfiguration ConfigurationSection(
/// <param name="assemblies">A collection of assemblies that contains sinks and other types.</param>
/// <returns>An object allowing configuration to continue.</returns>
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")]
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration Configuration(
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
Expand All @@ -198,6 +213,8 @@ public static LoggerConfiguration Configuration(
/// <param name="assemblies">A collection of assemblies that contains sinks and other types.</param>
/// <returns>An object allowing configuration to continue.</returns>
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")]
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration Configuration(
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
Expand All @@ -211,6 +228,8 @@ public static LoggerConfiguration Configuration(
/// <param name="configuration">A configuration object which contains a Serilog section.</param>
/// <param name="readerOptions">Options to adjust how the configuration object is processed.</param>
/// <returns>An object allowing configuration to continue.</returns>
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
public static LoggerConfiguration Configuration(
this LoggerSettingsConfiguration settingConfiguration,
IConfiguration configuration,
Expand All @@ -225,20 +244,26 @@ public static LoggerConfiguration Configuration(
return settingConfiguration.Settings(configurationReader);
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
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);
return new ConfigurationReader(section, assemblyFinder, readerOptions, configuration);
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
static ConfigurationReader GetConfigurationReader(IConfiguration configuration, ConfigurationReaderOptions readerOptions, ConfigurationAssemblySource source)
{
var assemblyFinder = AssemblyFinder.ForSource(source);
var section = string.IsNullOrWhiteSpace(readerOptions.SectionName) ? configuration : configuration.GetSection(readerOptions.SectionName);
return new ConfigurationReader(section, assemblyFinder, readerOptions, configuration);
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
static ConfigurationReader GetConfigurationReader(IConfiguration configuration, ConfigurationReaderOptions readerOptions, IReadOnlyCollection<Assembly> assemblies)
{
var section = string.IsNullOrWhiteSpace(readerOptions.SectionName) ? configuration : configuration.GetSection(readerOptions.SectionName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<Description>Microsoft.Extensions.Configuration (appsettings.json) support for Serilog.</Description>
<VersionPrefix>4.0.0</VersionPrefix>
<Authors>Serilog Contributors</Authors>
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
<TargetFrameworks>net7.0;netstandard2.0;net461</TargetFrameworks>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<AssemblyName>Serilog.Settings.Configuration</AssemblyName>
<PackageTags>serilog;json</PackageTags>
Expand All @@ -15,6 +15,10 @@
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<IsTrimmable>true</IsTrimmable>
<EnableAotAnalyzer>true</EnableAotAnalyzer>
agocke marked this conversation as resolved.
Show resolved Hide resolved
<EnableSingleFileAnalyzer>true</EnableSingleFileAnalyzer>
<PolySharpIncludeRuntimeSupportedAttributes>true</PolySharpIncludeRuntimeSupportedAttributes>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likely has a negligible impact, but if you want to minimize the size impact of PolySharp as much as possible here you can optionally get it to only polyfill the types you're actually using, instead of all available ones, which is the default. You can do so by adding the following MSBuild property here:

<PolySharpIncludeGeneratedTypes>
  System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute;
  System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute;
  System.Diagnostics.CodeAnalysis.RequiresAssemblyFilesAttribute;
</PolySharpIncludeGeneratedTypes>

</PropertyGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
Expand All @@ -13,6 +14,8 @@

namespace Serilog.Settings.Configuration;

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
class ConfigurationReader : IConfigurationReader
{
const string LevelSwitchNameRegex = @"^\${0,1}[A-Za-z]+[A-Za-z0-9]*$";
Expand Down Expand Up @@ -298,6 +301,7 @@ void ApplyEnrichment(LoggerConfiguration loggerConfiguration)
}
}

[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
internal ILookup<string, Dictionary<string, IConfigurationArgumentValue>> GetMethodCalls(IConfiguration directive)
{
var children = directive.GetChildren().ToList();
Expand Down Expand Up @@ -331,6 +335,7 @@ static string GetSectionName(IConfigurationSection s)
}
}

[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
internal static IConfigurationArgumentValue GetArgumentValue(IConfigurationSection argumentSection, IReadOnlyCollection<Assembly> configurationAssemblies)
{
IConfigurationArgumentValue argumentValue;
Expand Down Expand Up @@ -359,7 +364,7 @@ internal static IConfigurationArgumentValue GetArgumentValue(IConfigurationSecti
static IReadOnlyCollection<Assembly> LoadConfigurationAssemblies(IConfiguration section, AssemblyFinder assemblyFinder)
{
var serilogAssembly = typeof(ILogger).Assembly;
var assemblies = new Dictionary<string, Assembly> { [serilogAssembly.FullName] = serilogAssembly };
var assemblies = new Dictionary<string, Assembly> { [serilogAssembly.FullName!] = serilogAssembly };

var usingSection = section.GetSection("Using");
if (usingSection.GetChildren().Any())
Expand All @@ -371,16 +376,16 @@ static IReadOnlyCollection<Assembly> LoadConfigurationAssemblies(IConfiguration
"A zero-length or whitespace assembly name was supplied to a Serilog.Using configuration statement.");

var assembly = Assembly.Load(new AssemblyName(simpleName));
if (!assemblies.ContainsKey(assembly.FullName))
assemblies.Add(assembly.FullName, assembly);
if (!assemblies.ContainsKey(assembly.FullName!))
assemblies.Add(assembly.FullName!, assembly);
}
}

foreach (var assemblyName in assemblyFinder.FindAssembliesContainingName("serilog"))
{
var assumed = Assembly.Load(assemblyName);
if (assumed != null && !assemblies.ContainsKey(assumed.FullName))
assemblies.Add(assumed.FullName, assumed);
if (assumed != null && !assemblies.ContainsKey(assumed.FullName!))
assemblies.Add(assumed.FullName!, assumed);
}

return assemblies.Values.ToList().AsReadOnly();
Expand Down Expand Up @@ -504,6 +509,7 @@ static bool ParameterNameMatches(string? actualParameterName, IEnumerable<string
return suppliedNames.Any(s => ParameterNameMatches(actualParameterName, s));
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
static IReadOnlyCollection<MethodInfo> FindSinkConfigurationMethods(IReadOnlyCollection<Assembly> configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods)
{
var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerSinkConfiguration), allowInternalTypes, allowInternalMethods);
Expand All @@ -513,6 +519,7 @@ static IReadOnlyCollection<MethodInfo> FindSinkConfigurationMethods(IReadOnlyCol
return found;
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
static IReadOnlyCollection<MethodInfo> FindAuditSinkConfigurationMethods(IReadOnlyCollection<Assembly> configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods)
{
var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerAuditSinkConfiguration), allowInternalTypes, allowInternalMethods);
Expand All @@ -521,6 +528,7 @@ static IReadOnlyCollection<MethodInfo> FindAuditSinkConfigurationMethods(IReadOn
return found;
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
static IReadOnlyCollection<MethodInfo> FindFilterConfigurationMethods(IReadOnlyCollection<Assembly> configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods)
{
var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerFilterConfiguration), allowInternalTypes, allowInternalMethods);
Expand All @@ -530,6 +538,7 @@ static IReadOnlyCollection<MethodInfo> FindFilterConfigurationMethods(IReadOnlyC
return found;
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
static IReadOnlyCollection<MethodInfo> FindDestructureConfigurationMethods(IReadOnlyCollection<Assembly> configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods)
{
var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerDestructuringConfiguration), allowInternalTypes, allowInternalMethods);
Expand All @@ -539,6 +548,7 @@ static IReadOnlyCollection<MethodInfo> FindDestructureConfigurationMethods(IRead
return found;
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
static IReadOnlyCollection<MethodInfo> FindEventEnricherConfigurationMethods(IReadOnlyCollection<Assembly> configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods)
{
var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerEnrichmentConfiguration), allowInternalTypes, allowInternalMethods);
Expand All @@ -548,6 +558,7 @@ static IReadOnlyCollection<MethodInfo> FindEventEnricherConfigurationMethods(IRe
return found;
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
static List<MethodInfo> FindConfigurationExtensionMethods(IReadOnlyCollection<Assembly> configurationAssemblies, Type configType, bool allowInternalTypes, bool allowInternalMethods)
{
// ExtensionAttribute can be polyfilled to support extension methods
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

namespace Serilog.Settings.Configuration;

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
class ObjectArgumentValue : IConfigurationArgumentValue
{
readonly IConfigurationSection _section;
Expand Down Expand Up @@ -98,6 +100,7 @@ bool TryCreateContainer([NotNullWhen(true)] out object? result)
}
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
internal static bool TryBuildCtorExpression(
IConfigurationSection section, Type parameterType, ResolutionContext resolutionContext, [NotNullWhen(true)] out NewExpression? ctorExpression)
{
Expand Down Expand Up @@ -218,7 +221,9 @@ static bool TryBindToCtorArgument(object value, Type type, ResolutionContext res
}
}

static bool IsContainer(Type type, [NotNullWhen(true)] out Type? elementType)
static bool IsContainer(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type type,
[NotNullWhen(true)] out Type? elementType)
{
elementType = null;
foreach (var iface in type.GetInterfaces())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Text.RegularExpressions;

using Serilog.Core;

namespace Serilog.Settings.Configuration;

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
class StringArgumentValue : IConfigurationArgumentValue
{
readonly string _providedValue;
Expand Down Expand Up @@ -157,6 +158,7 @@ public StringArgumentValue(string providedValue)
return Convert.ChangeType(argumentValue, toType, resolutionContext.ReaderOptions.FormatProvider);
}

[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
internal static Type? FindType(string typeName)
{
var type = Type.GetType(typeName);
Expand Down
13 changes: 13 additions & 0 deletions src/Serilog.Settings.Configuration/TrimWarningMessages.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

using System.Data;

namespace Serilog
{
internal static class TrimWarningMessages
{
public const string NotSupportedWhenTrimming = "Automatic configuration is not supported when trimming.";
public const string NotSupportedInAot = "Automatic configuration is not supported when AOT compiling.";
public const string UnboundedReflection = "Uses unbounded reflection to load types";
public const string CreatesArraysOfArbitraryTypes = "Creates arrays of arbitrary types";
}
}