Skip to content

Commit c373e68

Browse files
committed
Add new constructor for Serilog.Settings.Configuration integration
1 parent 9661c5e commit c373e68

9 files changed

+418
-9
lines changed

src/Log4NetTextFormatter.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics.CodeAnalysis;
4+
using System.Globalization;
45
using System.IO;
56
using System.Linq;
67
using System.Text.RegularExpressions;
@@ -102,6 +103,61 @@ public Log4NetTextFormatter(Action<Log4NetTextFormatterOptionsBuilder>? configur
102103
_usesLog4JCompatibility = ReferenceEquals(Log4NetTextFormatterOptionsBuilder.Log4JXmlNamespace, _options.XmlNamespace);
103104
}
104105

106+
/// <summary>
107+
/// A highly improbable value to be used as the null text.
108+
/// </summary>
109+
private const string NullTextDefaultMarker = "$Serilog.Formatting.Log4Net.Log4NetTextFormatter.nullText$";
110+
111+
/// <summary>
112+
/// Do not use this constructor. It is only available for the <a href="https://github.com/serilog/serilog-settings-configuration">Serilog.Settings.Configuration</a> integration.
113+
/// The property filter, the message formatter and the exception formatter can only be configured through
114+
/// the <see cref="Log4NetTextFormatter(Action&lt;Log4NetTextFormatterOptionsBuilder&gt;)"/> constructor.
115+
/// </summary>
116+
/// <remarks>
117+
/// Binary compatibility across versions is not guaranteed. New optional parameters will be added in order to match new options.
118+
/// </remarks>
119+
[Obsolete("This constructor is only for use by the Serilog.Settings.Configuration package.", error: true)]
120+
[SuppressMessage("ReSharper", "UnusedMember.Global", Justification = "Used by Serilog.Settings.Configuration through reflection.")]
121+
public Log4NetTextFormatter(
122+
string? formatProvider = null,
123+
CDataMode? cDataMode = null,
124+
string? nullText = NullTextDefaultMarker,
125+
// in order to support options.UseNullText(null) on .NET < 10, see https://learn.microsoft.com/en-us/dotnet/core/compatibility/extensions/10.0/configuration-null-values-preserved
126+
bool noNullText = false,
127+
bool noXmlNamespace = false,
128+
LineEnding? lineEnding = null,
129+
Indentation? indentation = null,
130+
byte? indentationSize = null,
131+
bool noIndentation = false,
132+
bool log4JCompatibility = false
133+
) : this(options =>
134+
{
135+
if (formatProvider != null)
136+
options.UseFormatProvider(CultureInfo.GetCultureInfo(formatProvider));
137+
if (cDataMode != null)
138+
options.UseCDataMode(cDataMode.Value);
139+
if (nullText != NullTextDefaultMarker)
140+
options.UseNullText(nullText);
141+
if (noNullText)
142+
options.UseNullText(null);
143+
if (noXmlNamespace)
144+
options.UseNoXmlNamespace();
145+
if (lineEnding != null)
146+
options.UseLineEnding(lineEnding.Value);
147+
if (indentation != null && indentationSize != null)
148+
options.UseIndentationSettings(new IndentationSettings(indentation.Value, indentationSize.Value));
149+
else if (indentation != null)
150+
options.UseIndentationSettings(new IndentationSettings(indentation.Value, Log4NetTextFormatterOptionsBuilder.DefaultIndentationSize));
151+
else if (indentationSize != null)
152+
options.UseIndentationSettings(new IndentationSettings(Log4NetTextFormatterOptionsBuilder.DefaultIndentation, indentationSize.Value));
153+
if (noIndentation)
154+
options.UseNoIndentation();
155+
if (log4JCompatibility)
156+
options.UseLog4JCompatibility();
157+
})
158+
{
159+
}
160+
105161
/// <summary>
106162
/// Format the log event as log4net or log4j compatible XML format into the output.
107163
/// </summary>

src/Log4NetTextFormatterOptions.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,26 @@ internal Log4NetTextFormatterOptions(IFormatProvider? formatProvider, CDataMode
2121
}
2222

2323
/// <summary>See <see cref="Log4NetTextFormatterOptionsBuilder.UseFormatProvider"/></summary>
24-
internal IFormatProvider? FormatProvider { get; }
24+
public IFormatProvider? FormatProvider { get; }
2525

2626
/// <summary>See <see cref="Log4NetTextFormatterOptionsBuilder.UseCDataMode"/></summary>
27-
internal CDataMode CDataMode { get; }
27+
public CDataMode CDataMode { get; }
2828

2929
/// <summary>See <see cref="Log4NetTextFormatterOptionsBuilder.UseNullText"/></summary>
30-
internal string? NullText { get; }
30+
public string? NullText { get; }
3131

3232
/// <summary>See <see cref="Log4NetTextFormatterOptionsBuilder.UseNoXmlNamespace"/></summary>
33-
internal XmlQualifiedName? XmlNamespace { get; }
33+
public XmlQualifiedName? XmlNamespace { get; }
3434

3535
/// <summary>See <see cref="Log4NetTextFormatterOptionsBuilder.CreateXmlWriterSettings"/></summary>
36-
internal XmlWriterSettings XmlWriterSettings { get; }
36+
public XmlWriterSettings XmlWriterSettings { get; }
3737

3838
/// <summary>See <see cref="Log4NetTextFormatterOptionsBuilder.UsePropertyFilter"/></summary>
39-
internal PropertyFilter FilterProperty { get; }
39+
public PropertyFilter FilterProperty { get; }
4040

4141
/// <summary>See <see cref="Log4NetTextFormatterOptionsBuilder.UseMessageFormatter"/></summary>
42-
internal MessageFormatter FormatMessage { get; }
42+
public MessageFormatter FormatMessage { get; }
4343

4444
/// <summary>See <see cref="Log4NetTextFormatterOptionsBuilder.UseExceptionFormatter"/></summary>
45-
internal ExceptionFormatter FormatException { get; }
45+
public ExceptionFormatter FormatException { get; }
4646
}

src/Log4NetTextFormatterOptionsBuilder.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@ public class Log4NetTextFormatterOptionsBuilder
2121
/// <remarks>https://github.com/apache/log4j/blob/v1_2_17/src/main/java/org/apache/log4j/xml/XMLLayout.java#L137</remarks>
2222
internal static readonly XmlQualifiedName Log4JXmlNamespace = new("log4j", "http://jakarta.apache.org/log4j/");
2323

24+
/// <summary>
25+
/// The default indentation style, i.e. <c>space</c>
26+
/// </summary>
27+
internal const Indentation DefaultIndentation = Indentation.Space;
28+
29+
/// <summary>
30+
/// The default indentation size, i.e. <c>2</c>
31+
/// </summary>
32+
internal const byte DefaultIndentationSize = 2;
33+
2434
/// <summary>
2535
/// Initialize a new instance of the <see cref="Log4NetTextFormatterOptionsBuilder"/> class.
2636
/// </summary>
@@ -44,7 +54,7 @@ internal Log4NetTextFormatterOptionsBuilder()
4454
private LineEnding _lineEnding = LineEnding.LineFeed;
4555

4656
/// <summary>See <see cref="UseIndentationSettings"/></summary>
47-
private IndentationSettings? _indentationSettings = new(Indentation.Space, size: 2);
57+
private IndentationSettings? _indentationSettings = new(DefaultIndentation, DefaultIndentationSize);
4858

4959
/// <summary>See <see cref="UsePropertyFilter"/></summary>
5060
private PropertyFilter _filterProperty = (_, _) => true;

src/Serilog.Formatting.Log4Net.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@
5757
<None Update="packages.lock.json" Visible="false" />
5858
</ItemGroup>
5959

60+
<ItemGroup Label="Testing">
61+
<InternalsVisibleTo Include="Serilog.Formatting.Log4Net.Tests" />
62+
</ItemGroup>
63+
6064
<ItemGroup>
6165
<PackageReference Include="MinVer" Version="6.0.0" PrivateAssets="all" />
6266
<PackageReference Include="Serilog" Version="2.0.0" />

tests/PublicApi.net6.0.verified.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[assembly: System.CLSCompliant(true)]
22
[assembly: System.Reflection.AssemblyMetadata("RepositoryUrl", "https://github.com/serilog-contrib/serilog-formatting-log4net")]
3+
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Serilog.Formatting.Log4Net.Tests")]
34
[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName=".NET 6.0")]
45
namespace Serilog.Formatting.Log4Net
56
{
@@ -31,6 +32,8 @@ public class Log4NetTextFormatter : Serilog.Formatting.ITextFormatter
3132
{
3233
public Log4NetTextFormatter() { }
3334
public Log4NetTextFormatter(System.Action<Serilog.Formatting.Log4Net.Log4NetTextFormatterOptionsBuilder>? configureOptions) { }
35+
[System.Obsolete("This constructor is only for use by the Serilog.Settings.Configuration package.", true)]
36+
public Log4NetTextFormatter(string? formatProvider = null, Serilog.Formatting.Log4Net.CDataMode? cDataMode = default, string? nullText = "$Serilog.Formatting.Log4Net.Log4NetTextFormatter.nullText$", bool noNullText = false, bool noXmlNamespace = false, Serilog.Formatting.Log4Net.LineEnding? lineEnding = default, Serilog.Formatting.Log4Net.Indentation? indentation = default, byte? indentationSize = default, bool noIndentation = false, bool log4JCompatibility = false) { }
3437
public static Serilog.Formatting.Log4Net.Log4NetTextFormatter Log4JFormatter { get; }
3538
public void Format(Serilog.Events.LogEvent logEvent, System.IO.TextWriter output) { }
3639
}

tests/PublicApi.net8.0.verified.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[assembly: System.CLSCompliant(true)]
22
[assembly: System.Reflection.AssemblyMetadata("IsTrimmable", "True")]
33
[assembly: System.Reflection.AssemblyMetadata("RepositoryUrl", "https://github.com/serilog-contrib/serilog-formatting-log4net")]
4+
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Serilog.Formatting.Log4Net.Tests")]
45
[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v8.0", FrameworkDisplayName=".NET 8.0")]
56
namespace Serilog.Formatting.Log4Net
67
{
@@ -32,6 +33,8 @@ public class Log4NetTextFormatter : Serilog.Formatting.ITextFormatter
3233
{
3334
public Log4NetTextFormatter() { }
3435
public Log4NetTextFormatter(System.Action<Serilog.Formatting.Log4Net.Log4NetTextFormatterOptionsBuilder>? configureOptions) { }
36+
[System.Obsolete("This constructor is only for use by the Serilog.Settings.Configuration package.", true)]
37+
public Log4NetTextFormatter(string? formatProvider = null, Serilog.Formatting.Log4Net.CDataMode? cDataMode = default, string? nullText = "$Serilog.Formatting.Log4Net.Log4NetTextFormatter.nullText$", bool noNullText = false, bool noXmlNamespace = false, Serilog.Formatting.Log4Net.LineEnding? lineEnding = default, Serilog.Formatting.Log4Net.Indentation? indentation = default, byte? indentationSize = default, bool noIndentation = false, bool log4JCompatibility = false) { }
3538
public static Serilog.Formatting.Log4Net.Log4NetTextFormatter Log4JFormatter { get; }
3639
public void Format(Serilog.Events.LogEvent logEvent, System.IO.TextWriter output) { }
3740
}

tests/PublicApi.netstandard2.0.verified.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[assembly: System.CLSCompliant(true)]
22
[assembly: System.Reflection.AssemblyMetadata("RepositoryUrl", "https://github.com/serilog-contrib/serilog-formatting-log4net")]
3+
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Serilog.Formatting.Log4Net.Tests")]
34
[assembly: System.Runtime.Versioning.TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName=".NET Standard 2.0")]
45
namespace Serilog.Formatting.Log4Net
56
{
@@ -31,6 +32,8 @@ public class Log4NetTextFormatter : Serilog.Formatting.ITextFormatter
3132
{
3233
public Log4NetTextFormatter() { }
3334
public Log4NetTextFormatter(System.Action<Serilog.Formatting.Log4Net.Log4NetTextFormatterOptionsBuilder>? configureOptions) { }
35+
[System.Obsolete("This constructor is only for use by the Serilog.Settings.Configuration package.", true)]
36+
public Log4NetTextFormatter(string? formatProvider = null, Serilog.Formatting.Log4Net.CDataMode? cDataMode = default, string? nullText = "$Serilog.Formatting.Log4Net.Log4NetTextFormatter.nullText$", bool noNullText = false, bool noXmlNamespace = false, Serilog.Formatting.Log4Net.LineEnding? lineEnding = default, Serilog.Formatting.Log4Net.Indentation? indentation = default, byte? indentationSize = default, bool noIndentation = false, bool log4JCompatibility = false) { }
3437
public static Serilog.Formatting.Log4Net.Log4NetTextFormatter Log4JFormatter { get; }
3538
public void Format(Serilog.Events.LogEvent logEvent, System.IO.TextWriter output) { }
3639
}

tests/Serilog.Formatting.Log4Net.Tests.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,23 @@
88
<ItemGroup>
99
<PackageReference Include="AwesomeAssertions" Version="9.1.0" />
1010
<PackageReference Include="coverlet.collector" Version="6.0.4" PrivateAssets="all" />
11+
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.9" />
1112
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
13+
<PackageReference Include="NuGet.Versioning" Version="6.14.0" />
1214
<PackageReference Include="PublicApiGenerator" Version="11.4.6" />
15+
<PackageReference Include="ReflectionMagic" Version="5.0.1" />
1316
<PackageReference Include="ReportGenerator" Version="5.4.13" PrivateAssets="all" />
1417
<PackageReference Include="Serilog" Version="4.3.0" />
1518
<PackageReference Include="Serilog.Enrichers.Environment" Version="3.0.1" />
1619
<PackageReference Include="Serilog.Enrichers.Thread" Version="4.0.0" />
20+
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
21+
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
22+
<PackageReference Include="Tomlyn.Extensions.Configuration" Version="1.0.6" />
1723
<PackageReference Include="Verify" Version="30.17.0" GeneratePathProperty="true" />
1824
<PackageReference Include="Verify.Xunit" Version="30.17.0" />
1925
<PackageReference Include="xunit" Version="2.9.3" />
2026
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" PrivateAssets="all" />
27+
<PackageReference Include="Xunit.SkippableFact" Version="1.5.23" />
2128
</ItemGroup>
2229

2330
<ItemGroup>

0 commit comments

Comments
 (0)