private static void MergeLiterals(IList <LayoutRenderer> list) { for (int i = 0; i + 1 < list.Count;) { if (list[i] is LiteralLayoutRenderer lr1 && list[i + 1] is LiteralLayoutRenderer lr2) { lr1.Text += lr2.Text; // Combined literals don't support rawValue if (lr1 is LiteralWithRawValueLayoutRenderer lr1WithRaw) { list[i] = new LiteralLayoutRenderer(lr1WithRaw.Text); } list.RemoveAt(i + 1); }
private static void MergeLiterals(ArrayList list) { for (int i = 0; i + 1 < list.Count;) { LiteralLayoutRenderer lr1 = list[i] as LiteralLayoutRenderer; LiteralLayoutRenderer lr2 = list[i + 1] as LiteralLayoutRenderer; if (lr1 != null && lr2 != null) { lr1.Text += lr2.Text; list.RemoveAt(i + 1); } else { i++; } } }
private static LayoutRenderer GetLayoutRenderer(ConfigurationItemFactory configurationItemFactory, string name, bool?throwConfigExceptions) { LayoutRenderer layoutRenderer; try { layoutRenderer = configurationItemFactory.LayoutRenderers.CreateInstance(name); } catch (Exception ex) { if (throwConfigExceptions ?? LogManager.ThrowConfigExceptions ?? LogManager.ThrowExceptions) { throw; // TODO NLog 5.0 throw NLogConfigurationException. Maybe also include entire input layout-string (if not too long) } InternalLogger.Error(ex, "Error parsing layout {0} will be ignored.", name); // replace with empty values layoutRenderer = new LiteralLayoutRenderer(string.Empty); } return(layoutRenderer); }
private static LayoutRenderer GetLayoutRenderer(ConfigurationItemFactory configurationItemFactory, string name) { LayoutRenderer layoutRenderer; try { layoutRenderer = configurationItemFactory.LayoutRenderers.CreateInstance(name); } catch (Exception ex) { if (LogManager.ThrowConfigExceptions ?? LogManager.ThrowExceptions) { throw; } InternalLogger.Error(ex, "Error parsing layout {0} will be ignored.", name); //replace with emptys layoutRenderer = new LiteralLayoutRenderer(string.Empty); } return(layoutRenderer); }
private static LayoutRenderer GetLayoutRenderer(ConfigurationItemFactory configurationItemFactory, string name, bool?throwConfigExceptions) { LayoutRenderer layoutRenderer; try { layoutRenderer = configurationItemFactory.LayoutRenderers.CreateInstance(name); } catch (Exception ex) { var configException = new NLogConfigurationException(ex, $"Error parsing layout {name}"); if (throwConfigExceptions ?? configException.MustBeRethrown()) { throw configException; } // replace with empty values layoutRenderer = new LiteralLayoutRenderer(string.Empty); } return(layoutRenderer); }
public void DoubleNestedLayoutWithDefaultLayoutParametersTest() { Layout l = new Layout("${file-contents:${basedir}/${file-contents:${basedir}/aaa.txt}/aaa.txt}"); Assert.AreEqual(1, l.Renderers.Length); FileContentsLayoutRenderer lr = l.Renderers[0] as FileContentsLayoutRenderer; Assert.IsNotNull(lr); Assert.IsInstanceOfType(typeof(Layout), lr.FileName); Assert.AreEqual("${basedir}/${file-contents:${basedir}/aaa.txt}/aaa.txt", lr.FileName.Text); Assert.AreEqual(3, lr.FileName.Renderers.Length); Assert.IsInstanceOfType(typeof(LiteralLayoutRenderer), lr.FileName.Renderers[0]); Assert.IsInstanceOfType(typeof(FileContentsLayoutRenderer), lr.FileName.Renderers[1]); Assert.IsInstanceOfType(typeof(LiteralLayoutRenderer), lr.FileName.Renderers[2]); LiteralLayoutRenderer lr1 = (LiteralLayoutRenderer)lr.FileName.Renderers[0]; FileContentsLayoutRenderer fc = (FileContentsLayoutRenderer)lr.FileName.Renderers[1]; LiteralLayoutRenderer lr2 = (LiteralLayoutRenderer)lr.FileName.Renderers[2]; Assert.AreEqual("${basedir}/aaa.txt", fc.FileName.Text); }
private static LayoutRenderer ParseLayoutRenderer(ConfigurationItemFactory configurationItemFactory, SimpleStringReader sr) { int ch = sr.Read(); Debug.Assert(ch == '{', "'{' expected in layout specification"); string name = ParseLayoutRendererName(sr); LayoutRenderer lr; try { lr = configurationItemFactory.LayoutRenderers.CreateInstance(name); } catch (Exception ex) { if (LogManager.ThrowConfigExceptions ?? LogManager.ThrowExceptions) { throw; } InternalLogger.Error(ex, "Error parsing layout {0} will be ignored.", name); //replace with emptys lr = new LiteralLayoutRenderer(string.Empty); } var wrappers = new Dictionary <Type, LayoutRenderer>(); var orderedWrappers = new List <LayoutRenderer>(); ch = sr.Read(); while (ch != -1 && ch != '}') { string parameterName = ParseParameterName(sr).Trim(); if (sr.Peek() == '=') { sr.Read(); // skip the '=' PropertyInfo pi; LayoutRenderer parameterTarget = lr; if (!PropertyHelper.TryGetPropertyInfo(lr, parameterName, out pi)) { Type wrapperType; if (configurationItemFactory.AmbientProperties.TryGetDefinition(parameterName, out wrapperType)) { LayoutRenderer wrapperRenderer; if (!wrappers.TryGetValue(wrapperType, out wrapperRenderer)) { wrapperRenderer = configurationItemFactory.AmbientProperties.CreateInstance(parameterName); wrappers[wrapperType] = wrapperRenderer; orderedWrappers.Add(wrapperRenderer); } if (!PropertyHelper.TryGetPropertyInfo(wrapperRenderer, parameterName, out pi)) { pi = null; } else { parameterTarget = wrapperRenderer; } } } if (pi == null) { ParseParameterValue(sr); } else { if (typeof(Layout).IsAssignableFrom(pi.PropertyType)) { var nestedLayout = new SimpleLayout(); string txt; LayoutRenderer[] renderers = CompileLayout(configurationItemFactory, sr, true, out txt); nestedLayout.SetRenderers(renderers, txt); pi.SetValue(parameterTarget, nestedLayout, null); } else if (typeof(ConditionExpression).IsAssignableFrom(pi.PropertyType)) { var conditionExpression = ConditionParser.ParseExpression(sr, configurationItemFactory); pi.SetValue(parameterTarget, conditionExpression, null); } else { string value = ParseParameterValue(sr); PropertyHelper.SetPropertyFromString(parameterTarget, parameterName, value, configurationItemFactory); } } } else { // what we've just read is not a parameterName, but a value // assign it to a default property (denoted by empty string) PropertyInfo pi; if (PropertyHelper.TryGetPropertyInfo(lr, string.Empty, out pi)) { if (typeof(SimpleLayout) == pi.PropertyType) { pi.SetValue(lr, new SimpleLayout(parameterName), null); } else { string value = parameterName; PropertyHelper.SetPropertyFromString(lr, pi.Name, value, configurationItemFactory); } } else { InternalLogger.Warn("{0} has no default property", lr.GetType().FullName); } } ch = sr.Read(); } lr = ApplyWrappers(configurationItemFactory, lr, orderedWrappers); return(lr); }