Skip to content

Commit e0b9a7d

Browse files
committed
Add new constructor for Serilog.Settings.Configuration integration
1 parent 6abd8f4 commit e0b9a7d

9 files changed

+414
-9
lines changed

src/Log4NetTextFormatter.cs

Lines changed: 51 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;
@@ -93,6 +94,56 @@ public Log4NetTextFormatter(Action<Log4NetTextFormatterOptionsBuilder>? configur
9394
_usesLog4JCompatibility = ReferenceEquals(Log4NetTextFormatterOptionsBuilder.Log4JXmlNamespace, _options.XmlNamespace);
9495
}
9596

97+
/// <summary>
98+
/// A highly improbable value to be used as the null text.
99+
/// </summary>
100+
private const string NullTextDefaultMarker = "$Serilog.Formatting.Log4Net.Log4NetTextFormatter.nullText$";
101+
102+
/// <summary>
103+
/// Do not use this constructor. It is only available for the Serilog.Settings.Configuration integration.
104+
/// </summary>
105+
[Obsolete("This constructor is only for use by the Serilog.Settings.Configuration package.", error: true)]
106+
[SuppressMessage("ReSharper", "UnusedMember.Global", Justification = "Used by Serilog.Settings.Configuration through reflection.")]
107+
public Log4NetTextFormatter(
108+
string? formatProvider = null,
109+
CDataMode? cDataMode = null,
110+
string? nullText = NullTextDefaultMarker,
111+
// 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
112+
bool noNullText = false,
113+
bool noXmlNamespace = false,
114+
LineEnding? lineEnding = null,
115+
Indentation? indentation = null,
116+
byte? indentationSize = null,
117+
bool noIndentation = false,
118+
bool log4JCompatibility = false
119+
) : this(options =>
120+
{
121+
if (formatProvider != null)
122+
options.UseFormatProvider(CultureInfo.GetCultureInfo(formatProvider));
123+
if (cDataMode != null)
124+
options.UseCDataMode(cDataMode.Value);
125+
if (nullText != NullTextDefaultMarker)
126+
options.UseNullText(nullText);
127+
if (noNullText)
128+
options.UseNullText(null);
129+
if (noXmlNamespace)
130+
options.UseNoXmlNamespace();
131+
if (lineEnding != null)
132+
options.UseLineEnding(lineEnding.Value);
133+
if (indentation != null && indentationSize != null)
134+
options.UseIndentationSettings(new IndentationSettings(indentation.Value, indentationSize.Value));
135+
else if (indentation != null)
136+
options.UseIndentationSettings(new IndentationSettings(indentation.Value, Log4NetTextFormatterOptionsBuilder.DefaultIndentationSize));
137+
else if (indentationSize != null)
138+
options.UseIndentationSettings(new IndentationSettings(Log4NetTextFormatterOptionsBuilder.DefaultIndentation, indentationSize.Value));
139+
if (noIndentation)
140+
options.UseNoIndentation();
141+
if (log4JCompatibility)
142+
options.UseLog4JCompatibility();
143+
})
144+
{
145+
}
146+
96147
/// <summary>
97148
/// Format the log event as log4net or log4j compatible XML format into the output.
98149
/// </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)