diff --git a/ChangeLog b/ChangeLog index 7321c215..1fefbad9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2006-06-25 Jaroslaw Kowalski + * implemented that wraps all + targets in section with the specified wrapper. + 2006-06-23 Jaroslaw Kowalski * fixed some race conditions in the Network target * added NetworkTarget.Close() diff --git a/src/NLog/Config/XmlLoggingConfiguration.cs b/src/NLog/Config/XmlLoggingConfiguration.cs index 6a7a6967..62595a38 100644 --- a/src/NLog/Config/XmlLoggingConfiguration.cs +++ b/src/NLog/Config/XmlLoggingConfiguration.cs @@ -44,6 +44,7 @@ using NLog.Filters; using NLog.LayoutRenderers; using NLog.Internal; +using NLog.Targets.Wrappers; namespace NLog.Config { @@ -534,6 +535,7 @@ private void ConfigureTargetsFromElement(XmlElement element) return ; bool asyncWrap = 0 == String.Compare(GetCaseInsensitiveAttribute(element, "async"), "true", true); + XmlElement defaultWrapperElement = null; foreach (XmlNode n in element.ChildNodes) { @@ -541,10 +543,19 @@ private void ConfigureTargetsFromElement(XmlElement element) if (targetElement == null) continue; + + if (0 == String.Compare(targetElement.LocalName, "default-wrapper")) + { + defaultWrapperElement = targetElement; + continue; + } if (0 == String.Compare(targetElement.LocalName, "target", true) || 0 == String.Compare(targetElement.LocalName, "appender", true) || - 0 == String.Compare(targetElement.LocalName, "wrapper", true)) + 0 == String.Compare(targetElement.LocalName, "wrapper", true) || + 0 == String.Compare(targetElement.LocalName, "wrapper-target", true) || + 0 == String.Compare(targetElement.LocalName, "compound-target", true) + ) { string type = GetCaseInsensitiveAttribute(targetElement, "type"); Target newTarget = TargetFactory.CreateTarget(type); @@ -563,6 +574,29 @@ private void ConfigureTargetsFromElement(XmlElement element) newTarget = atw; } #endif + if (defaultWrapperElement != null) + { + string wrapperType = GetCaseInsensitiveAttribute(defaultWrapperElement, "type"); + Target wrapperTargetInstance = TargetFactory.CreateTarget(wrapperType); + WrapperTargetBase wtb = wrapperTargetInstance as WrapperTargetBase; + if (wtb == null) + throw new Exception("Target type specified on is not a wrapper."); + ConfigureTargetFromXmlElement(wrapperTargetInstance, defaultWrapperElement); + while (wtb.WrappedTarget != null) + { + wtb = wtb.WrappedTarget as WrapperTargetBase; + if (wtb == null) + throw new Exception("Child target type specified on is not a wrapper."); + } + wtb.WrappedTarget = newTarget; + wrapperTargetInstance.Name = newTarget.Name; + newTarget.Name = newTarget.Name + "_wrapped"; + + InternalLogger.Debug("Wrapping target '{0}' with '{1}' and renaming to '{2}", wrapperTargetInstance.Name, wrapperTargetInstance.GetType().Name, newTarget.Name); + newTarget = wrapperTargetInstance; + } + + InternalLogger.Info("Adding target {0}", newTarget); AddTarget(newTarget.Name, newTarget); } } @@ -619,7 +653,7 @@ private void ConfigureTargetFromXmlElement(Target target, XmlElement element) XmlElement el = (XmlElement)node; string name = el.LocalName; - if ((name == "target" || name == "wrapper") && compound != null) + if ((name == "target" || name == "wrapper" || name == "wrapper-target" || name == "compound-target") && compound != null) { string type = GetCaseInsensitiveAttribute(el, "type"); Target newTarget = TargetFactory.CreateTarget(type); @@ -636,7 +670,7 @@ private void ConfigureTargetFromXmlElement(Target target, XmlElement element) continue; } - if ((name == "target" || name == "wrapper") && wrapper != null) + if ((name == "target" || name == "wrapper" || name == "wrapper-target" || name == "compound-target") && wrapper != null) { string type = GetCaseInsensitiveAttribute(el, "type"); Target newTarget = TargetFactory.CreateTarget(type); diff --git a/src/NLog/Target.cs b/src/NLog/Target.cs index e383a37f..92942dbf 100644 --- a/src/NLog/Target.cs +++ b/src/NLog/Target.cs @@ -196,10 +196,7 @@ protected internal virtual int NeedsStackTrace() /// A string that describes the target. public override string ToString() { - if (Name != null) - return String.Format("{0}: {1}", Name, this.GetType().FullName); - else - return this.GetType().FullName; + return ((this.Name != null) ? this.Name : "unnamed") + ":" + this.GetType().Name; } /// diff --git a/src/NLog/Targets/Wrappers/WrapperTargetBase.cs b/src/NLog/Targets/Wrappers/WrapperTargetBase.cs index 82659a06..031e1223 100644 --- a/src/NLog/Targets/Wrappers/WrapperTargetBase.cs +++ b/src/NLog/Targets/Wrappers/WrapperTargetBase.cs @@ -97,5 +97,13 @@ public override void Initialize() WrappedTarget.Initialize(); } + /// + /// Returns the text representation of the object. Used for diagnostics. + /// + /// A string that describes the target. + public override string ToString() + { + return ((this.Name != null) ? this.Name : "unnamed") + ":" + this.GetType().Name + "(" + ((WrappedTarget != null) ? WrappedTarget.ToString() : "null") + ")"; + } } } diff --git a/tests/NLog.Test/App.config b/tests/NLog.Test/App.config index f49cf42f..fde9b191 100644 --- a/tests/NLog.Test/App.config +++ b/tests/NLog.Test/App.config @@ -13,8 +13,12 @@ - - + + + + + + diff --git a/tools/MakeNLogXSD/Program.cs b/tools/MakeNLogXSD/Program.cs index 50eab7c7..7ca74ea1 100644 --- a/tools/MakeNLogXSD/Program.cs +++ b/tools/MakeNLogXSD/Program.cs @@ -183,6 +183,20 @@ static void DumpType(XmlTextWriter xtw, Type t) xtw.WriteAttributeString("minOccurs", "1"); xtw.WriteAttributeString("maxOccurs", "1"); xtw.WriteEndElement(); + + xtw.WriteStartElement("xs:element"); + xtw.WriteAttributeString("name", "wrapper-target"); + xtw.WriteAttributeString("type", "WrapperTargetBase"); + xtw.WriteAttributeString("minOccurs", "1"); + xtw.WriteAttributeString("maxOccurs", "1"); + xtw.WriteEndElement(); + + xtw.WriteStartElement("xs:element"); + xtw.WriteAttributeString("name", "compound-target"); + xtw.WriteAttributeString("type", "CompoundTargetBase"); + xtw.WriteAttributeString("minOccurs", "1"); + xtw.WriteAttributeString("maxOccurs", "1"); + xtw.WriteEndElement(); } if (t == typeof(CompoundTargetBase)) @@ -193,6 +207,20 @@ static void DumpType(XmlTextWriter xtw, Type t) xtw.WriteAttributeString("minOccurs", "1"); xtw.WriteAttributeString("maxOccurs", "unbounded"); xtw.WriteEndElement(); + + xtw.WriteStartElement("xs:element"); + xtw.WriteAttributeString("name", "wrapper-target"); + xtw.WriteAttributeString("type", "WrapperTargetBase"); + xtw.WriteAttributeString("minOccurs", "1"); + xtw.WriteAttributeString("maxOccurs", "1"); + xtw.WriteEndElement(); + + xtw.WriteStartElement("xs:element"); + xtw.WriteAttributeString("name", "compound-target"); + xtw.WriteAttributeString("type", "CompoundTargetBase"); + xtw.WriteAttributeString("minOccurs", "1"); + xtw.WriteAttributeString("maxOccurs", "1"); + xtw.WriteEndElement(); } xtw.WriteEndElement(); diff --git a/tools/MakeNLogXSD/TemplateNLog.xsd b/tools/MakeNLogXSD/TemplateNLog.xsd index b97614d8..22d4725e 100644 --- a/tools/MakeNLogXSD/TemplateNLog.xsd +++ b/tools/MakeNLogXSD/TemplateNLog.xsd @@ -56,7 +56,10 @@ + + +