65.9K
CodeProject 正在变化。 阅读更多。
Home

以编程方式编辑 Log4NET 配置

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2016 年 4 月 19 日

CPOL

1分钟阅读

viewsIcon

13755

downloadIcon

170

本文和相关的项目演示了如何使用 XDocument 编辑 log4net 配置文件。

引言

我遇到一种情况,需要将特定类生成的日志输出到单独的文件中。并且需要在多台机器上对许多服务进行更改。因此,我需要一个可以以编程方式执行此操作的工具。我们基本上需要在所有 log4net 配置文件中添加一个 appender 和一个 logger。

我将专门介绍如何更改配置文件,这是更大工具的一部分。

背景

这里的方法是使用 XML 编辑来更改 log4net 记录行为,跨多个组件。 使用 string 操作的另一种方法不可靠,有时会损坏 log4net 配置,导致记录完全失败。

Using the Code

提供了两个输入 Xelement,第一个在源文件中不存在,而另一个存在但属性值不同。输出将包含所有现有元素,并将包含输入中提供的更新值。

<logger name = "LoggerName" >

< level value="DEBUG" />

<appender-ref ref="ConsoleAppender" /></logger>

    <appender name="RollingLogFileAppender" 
    type="log4net.Appender.RollingFileAppender">
  < file value = "C:\\TestProj\\TestLog.txt" /> 
   < appendToFile value = "true" />  
    < rollingStyle value = "Size" />   
     < maxSizeRollBackups value = "10" />    
      < maximumFileSize value = "10MB" />     
       < staticLogFileName value = "true" />      
        < layout type = "log4net.Layout.PatternLayout" >       
           < conversionPattern value = "%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />        
          </layout >
        </appender>

       <root>
  <level value="DEBUG" />
  < appender-ref ref= "RollingLogFileAppender" />
  </ root > ";

            txtInput2.Text = @"<logger name="LoggerName">
    < level value = "DEBUG" />
 
     < appender-ref ref= "RollingLogFileAppender" />
   
     </ logger >

首先,我们从输入 string 创建 XmlDocument。然后,我们提取需要更新的属性。

    private void AppendConfigLog4net(string text1nput)
    {
        text1nput = ClearTextFromInvalidChars(text1nput);

        XDocument xmlDoc1 = XDocument.Parse(text1nput, LoadOptions.None);

        foreach (var v1 in xmlDoc1.Descendants())
        {
            if (string.Compare(v1.Name.LocalName, "appender", true) == 0)
            {
                AddAndReplaceAppenderElementInExisitngConfig(v1, v1.Attribute("name").Value, 
                v1.Element("file").Attribute("value").Value);
            }
            else if (string.Compare(v1.Name.LocalName, "logger", true) == 0)
            {
                AddorReplaceLoggerElementInExisitngConfig(v1, v1.Attribute("name").Value, 
                v1.Element("appender-ref").Attribute("ref").Value);
            }
        }
    }

然后,在现有的配置文件中,我们将其加载到 XmlDocument 中,并替换属性或添加新元素(如果它不存在)。

    private void AddorReplaceLoggerElementInExisitngConfig(XElement v1, string localName, string value)
    {
        var query = from c in xDoc.Root.Descendants("logger")
                    where (string)c.Attribute("name") == localName
                    select c;
        if (query.Count() <= 0)
        {
            var v2 = xDoc.Root.Descendants("logger").LastOrDefault();
            xDoc.Root.Add(new XElement(v1));
        }
        else
            foreach (XElement node in query)
            {
                if ((string)node.Element("appender-ref").Attribute("ref") != value)
                {
                    node.Element("appender-ref").Attribute("ref").Value = value;
                }
            }
    }

    private void AddAndReplaceAppenderElementInExisitngConfig
		(XElement xmlDoc1, string rfaAppender, string filePath)
    {
        var query = from c in xDoc.Root.Descendants("appender")
                    where (string)c.Attribute("name") == rfaAppender
                    select c;
        if (query.Count() <= 0)
        {
            xDoc.Root.AddFirst(xmlDoc1);
        }
        else
            foreach (XElement node in query)
            {
                if ((string)node.Element("file").Attribute("value") != filePath)
                {
                    node.Element("file").Attribute("value").Value = filePath;
                }
            }
    }

    private string ClearTextFromInvalidChars(string text1)
    {
        text1 = text1.Replace(((char)0xFEFF), '\0');
        text1 = text1.Replace("< ", "<");
        text1 = text1.Replace(" >", ">");
        text1 = text1.Replace("</ ", "</");
        return text1;
    }

我附上了包含所有详细信息的可用项目。

© . All rights reserved.