以编程方式编辑 Log4NET 配置





1.00/5 (1投票)
本文和相关的项目演示了如何使用 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;
}
我附上了包含所有详细信息的可用项目。