diff --git a/src/log4net/Layout/Internal/XmlWriterExtensions.NetFx.cs b/src/log4net/Layout/Internal/XmlWriterExtensions.NetFx.cs
new file mode 100644
index 00000000..897ad3fd
--- /dev/null
+++ b/src/log4net/Layout/Internal/XmlWriterExtensions.NetFx.cs
@@ -0,0 +1,32 @@
+using System.IO;
+using System.Xml;
+using log4net.Util;
+
+namespace log4net.Layout.Internal;
+
+partial class XmlWriterExtensions
+{
+ ///
+ /// Writes the specified start tag and associates it with the given namespace and prefix
+ ///
+ /// Writer
+ /// The full name of the element
+ /// The namespace prefix of the element (ignored for net4x)
+ /// The local name of the element (ignored for net4x)
+ /// The namespace URI to associate with the element (ignored for net4x)
+ internal static void WriteStartElement(this XmlWriter writer,
+ string fullName, string prefix, string localName, string ns)
+ => writer.WriteStartElement(fullName);
+
+ ///
+ /// Creates an XmlWriter
+ ///
+ /// TextWriter
+ /// XmlWriter
+ internal static XmlWriter CreateXmlWriter(TextWriter writer)
+ => new XmlTextWriter(new ProtectCloseTextWriter(writer))
+ {
+ Formatting = Formatting.None,
+ Namespaces = false
+ };
+}
diff --git a/src/log4net/Layout/Internal/XmlWriterExtensions.NetStandard.cs b/src/log4net/Layout/Internal/XmlWriterExtensions.NetStandard.cs
new file mode 100644
index 00000000..341f6a00
--- /dev/null
+++ b/src/log4net/Layout/Internal/XmlWriterExtensions.NetStandard.cs
@@ -0,0 +1,34 @@
+using System.IO;
+using System.Xml;
+using log4net.Util;
+
+namespace log4net.Layout.Internal;
+
+partial class XmlWriterExtensions
+{
+ private static readonly XmlWriterSettings settings = new XmlWriterSettings
+ {
+ Indent = false,
+ OmitXmlDeclaration = true
+ };
+
+ ///
+ /// writes the specified start tag and associates it with the given namespace and prefix
+ ///
+ /// Writer
+ /// The full name of the element (ignored for netstandard)
+ /// The namespace prefix of the element
+ /// The local name of the element
+ /// The namespace URI to associate with the element
+ internal static void WriteStartElement(this XmlWriter writer,
+ string fullName, string prefix, string localName, string ns)
+ => writer.WriteStartElement(prefix, localName, ns);
+
+ ///
+ /// Creates an XmlWriter
+ ///
+ /// TextWriter
+ /// XmlWriter
+ internal static XmlWriter CreateXmlWriter(TextWriter writer)
+ => XmlWriter.Create(new ProtectCloseTextWriter(writer), settings);
+}
\ No newline at end of file
diff --git a/src/log4net/Layout/Internal/XmlWriterExtensions.cs b/src/log4net/Layout/Internal/XmlWriterExtensions.cs
new file mode 100644
index 00000000..d5b17d58
--- /dev/null
+++ b/src/log4net/Layout/Internal/XmlWriterExtensions.cs
@@ -0,0 +1,10 @@
+namespace log4net.Layout.Internal;
+
+///
+/// Extensions for
+///
+/// Jan Friedrich
+[System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0060:Remove unused parameter",
+ Justification = "Compatibility between net4 and netstandard")]
+internal static partial class XmlWriterExtensions
+{ }
\ No newline at end of file
diff --git a/src/log4net/Layout/XmlLayout.cs b/src/log4net/Layout/XmlLayout.cs
index b30686a6..c23ecf9a 100644
--- a/src/log4net/Layout/XmlLayout.cs
+++ b/src/log4net/Layout/XmlLayout.cs
@@ -22,6 +22,7 @@
using System.Xml;
using log4net.Core;
+using log4net.Layout.Internal;
using log4net.Util;
namespace log4net.Layout
@@ -216,19 +217,10 @@ public override void ActivateOptions()
///
protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
{
-#if NETSTANDARD
- writer.WriteStartElement(m_prefix, ELM_EVENT, m_prefix);
- // writer.WriteAttributeString("xmlns", "log4net", null, "http://logging.apache.org/log4net/schemas/log4net-events-1.2");
-#else
- writer.WriteStartElement(m_elmEvent);
-#endif
+ writer.WriteStartElement(m_elmEvent, m_prefix, ELM_EVENT, m_prefix);
writer.WriteAttributeString(ATTR_LOGGER, loggingEvent.LoggerName);
-#if NET_2_0 || NETCF_2_0 || MONO_2_0 || NETSTANDARD
writer.WriteAttributeString(ATTR_TIMESTAMP, XmlConvert.ToString(loggingEvent.TimeStamp, XmlDateTimeSerializationMode.Local));
-#else
- writer.WriteAttributeString(ATTR_TIMESTAMP, XmlConvert.ToString(loggingEvent.TimeStamp));
-#endif
writer.WriteAttributeString(ATTR_LEVEL, loggingEvent.Level.DisplayName);
writer.WriteAttributeString(ATTR_THREAD, loggingEvent.ThreadName);
@@ -247,11 +239,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
}
// Append the message text
-#if NETSTANDARD
- writer.WriteStartElement(m_prefix, ELM_MESSAGE, m_prefix);
-#else
- writer.WriteStartElement(m_elmMessage);
-#endif
+ writer.WriteStartElement(m_elmMessage, m_prefix, ELM_MESSAGE, m_prefix);
if (!this.Base64EncodeMessage)
{
Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
@@ -269,18 +257,10 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
// Append the properties text
if (properties.Count > 0)
{
-#if NETSTANDARD
- writer.WriteStartElement(m_prefix, ELM_PROPERTIES, m_prefix);
-#else
- writer.WriteStartElement(m_elmProperties);
-#endif
+ writer.WriteStartElement(m_elmProperties, m_prefix, ELM_PROPERTIES, m_prefix);
foreach (System.Collections.DictionaryEntry entry in properties)
{
-#if NETSTANDARD
- writer.WriteStartElement(m_prefix, ELM_DATA, m_prefix);
-#else
- writer.WriteStartElement(m_elmData);
-#endif
+ writer.WriteStartElement(m_elmData, m_prefix, ELM_DATA, m_prefix);
writer.WriteAttributeString(ATTR_NAME, Transform.MaskXmlInvalidCharacters((string)entry.Key, this.InvalidCharReplacement));
// Use an ObjectRenderer to convert the object to a string
@@ -305,11 +285,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
if (exceptionStr != null && exceptionStr.Length > 0)
{
// Append the stack trace line
-#if NETSTANDARD
- writer.WriteStartElement(m_prefix, ELM_EXCEPTION, m_prefix);
-#else
- writer.WriteStartElement(m_elmException);
-#endif
+ writer.WriteStartElement(m_elmException, m_prefix, ELM_EXCEPTION, m_prefix);
Transform.WriteEscapedXmlString(writer, exceptionStr, this.InvalidCharReplacement);
writer.WriteEndElement();
}
@@ -318,11 +294,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
{
LocationInfo locationInfo = loggingEvent.LocationInformation;
-#if NETSTANDARD
- writer.WriteStartElement(m_prefix, ELM_LOCATION, m_prefix);
-#else
- writer.WriteStartElement(m_elmLocation);
-#endif
+ writer.WriteStartElement(m_elmLocation, m_prefix, ELM_LOCATION, m_prefix);
writer.WriteAttributeString(ATTR_CLASS, locationInfo.ClassName);
writer.WriteAttributeString(ATTR_METHOD, locationInfo.MethodName);
writer.WriteAttributeString(ATTR_FILE, locationInfo.FileName);
diff --git a/src/log4net/Layout/XmlLayoutBase.cs b/src/log4net/Layout/XmlLayoutBase.cs
index eb572284..798fcc6b 100644
--- a/src/log4net/Layout/XmlLayoutBase.cs
+++ b/src/log4net/Layout/XmlLayoutBase.cs
@@ -24,6 +24,7 @@
using log4net.Util;
using log4net.Core;
+using log4net.Layout.Internal;
namespace log4net.Layout
{
@@ -196,18 +197,7 @@ public override void Format(TextWriter writer, LoggingEvent loggingEvent)
{
throw new ArgumentNullException("loggingEvent");
}
-#if NETSTANDARD
- var settings = new XmlWriterSettings
- {
- Indent = false,
- OmitXmlDeclaration = true
- };
- using var xmlWriter = XmlWriter.Create(new ProtectCloseTextWriter(writer), settings);
-#else
- using XmlTextWriter xmlWriter = new XmlTextWriter(new ProtectCloseTextWriter(writer));
- xmlWriter.Formatting = Formatting.None;
- xmlWriter.Namespaces = false;
-#endif
+ using XmlWriter xmlWriter = XmlWriterExtensions.CreateXmlWriter(writer);
// Write the event to the writer
FormatXml(xmlWriter, loggingEvent);
@@ -252,4 +242,4 @@ public override void Format(TextWriter writer, LoggingEvent loggingEvent)
#endregion Private Instance Fields
}
-}
+}
\ No newline at end of file
diff --git a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs
index 448b145f..ef69e23f 100644
--- a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs
+++ b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs
@@ -24,6 +24,7 @@
using log4net.Core;
using log4net.Util;
+using log4net.Layout.Internal;
namespace log4net.Layout
{
@@ -112,7 +113,7 @@ public string Version
@@ -172,11 +173,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
}
// Write the start element
-#if NETSTANDARD
- writer.WriteStartElement("log4j", "event", "log4net");
-#else
- writer.WriteStartElement("log4j:event");
-#endif
+ writer.WriteStartElement("log4j:event", "log4j", "event", "log4net");
writer.WriteAttributeString("logger", loggingEvent.LoggerName);
// Calculate the timestamp as the number of milliseconds since january 1970
@@ -191,11 +188,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
writer.WriteAttributeString("thread", loggingEvent.ThreadName);
// Append the message text
-#if NETSTANDARD
- writer.WriteStartElement("log4j", "message", "log4net");
-#else
- writer.WriteStartElement("log4j:message");
-#endif
+ writer.WriteStartElement("log4j:message", "log4j", "message", "log4net");
Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
writer.WriteEndElement();
@@ -207,11 +200,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
if (valueStr != null && valueStr.Length > 0)
{
// Append the NDC text
-#if NETSTANDARD
- writer.WriteStartElement("log4j", "NDC", "log4net");
-#else
- writer.WriteStartElement("log4j:NDC");
-#endif
+ writer.WriteStartElement("log4j:NDC", "log4j", "NDC", "log4net");
Transform.WriteEscapedXmlString(writer, valueStr, this.InvalidCharReplacement);
writer.WriteEndElement();
}
@@ -221,18 +210,10 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
PropertiesDictionary properties = loggingEvent.GetProperties();
if (properties.Count > 0)
{
-#if NETSTANDARD
- writer.WriteStartElement("log4j", "properties", "log4net");
-#else
- writer.WriteStartElement("log4j:properties");
-#endif
+ writer.WriteStartElement("log4j:properties", "log4j", "properties", "log4net");
foreach (System.Collections.DictionaryEntry entry in properties)
{
-#if NETSTANDARD
- writer.WriteStartElement("log4j", "data", "log4net");
-#else
- writer.WriteStartElement("log4j:data");
-#endif
+ writer.WriteStartElement("log4j:data", "log4j", "data", "log4net");
writer.WriteAttributeString("name", (string)entry.Key);
// Use an ObjectRenderer to convert the object to a string
@@ -248,11 +229,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
if (exceptionStr != null && exceptionStr.Length > 0)
{
// Append the stack trace line
-#if NETSTANDARD
- writer.WriteStartElement("log4j", "throwable", "log4net");
-#else
- writer.WriteStartElement("log4j:throwable");
-#endif
+ writer.WriteStartElement("log4j:throwable", "log4j", "data", "log4net");
Transform.WriteEscapedXmlString(writer, exceptionStr, this.InvalidCharReplacement);
writer.WriteEndElement();
}
@@ -261,11 +238,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
{
LocationInfo locationInfo = loggingEvent.LocationInformation;
-#if NETSTANDARD
- writer.WriteStartElement("log4j", "locationInfo", "log4net");
-#else
- writer.WriteStartElement("log4j:locationInfo");
-#endif
+ writer.WriteStartElement("log4j:locationInfo", "log4j", "locationInfo", "log4net");
writer.WriteAttributeString("class", locationInfo.ClassName);
writer.WriteAttributeString("method", locationInfo.MethodName);
writer.WriteAttributeString("file", locationInfo.FileName);
@@ -276,5 +249,4 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
writer.WriteEndElement();
}
}
-}
-
+}
\ No newline at end of file
diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj
index 12a0e025..b641bccd 100644
--- a/src/log4net/log4net.csproj
+++ b/src/log4net/log4net.csproj
@@ -106,8 +106,13 @@
-
-
+
+
+
+
+
+
+