예제 #1
0
        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);
                }
예제 #2
0
 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++;
         }
     }
 }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }