gpt4 book ai didi

log4net - 如何在log4net的多行日志条目中添加缩进?

转载 作者:行者123 更新时间:2023-12-04 13:40:48 24 4
gpt4 key购买 nike

我知道this question,并且我同意答案,但是我可以对log4net执行以下操作吗?

而不是:

2013-04-09 12:54:47.093 INFO Main: Line 1 Line 1 Line 1
Line 2 Line 2 Line 2
Line 3 Line 3 Line 3
2013-04-09 12:54:47.093 INFO Main: Line 1 Line 1 Line 1
Line 2 Line 2 Line 2
Line 3 Line 3 Line 3

我能有......吗:
2013-04-09 12:54:47.093 INFO Main: Line 1 Line 1 Line 1
Line 2 Line 2 Line 2
Line 3 Line 3 Line 3
2013-04-09 12:54:47.093 INFO Main: Line 1 Line 1 Line 1
Line 2 Line 2 Line 2
Line 3 Line 3 Line 3

它是否已受支持,或者我需要编写自定义附加程序或自定义布局?

最佳答案

我不想回答自己的问题,但是由于我自己制定了答案,所以我想与您分享。

我扩展了log4net。该解决方案继承自PatternLayout,因此所有PatternLayout功能均可用。此外,还提供了新模式%indentation 。要获得上面示例中的日志记录,只需使用:

<conversionPattern value="%date - %indentation%message%newline%exception"/>

格式化异常时,log4net代码古怪(或者我不理解)。因此,在这种情况下,您应该始终在模式中放入%exception,因为我将其硬编码为“IgnoresException = false”。如果IgnoresException = true,则log4net会完全忽略任何格式,并且您会缩进。

使用下面的代码扩展log4net:
/// <summary>
/// Converts %indentation to string
/// </summary>
public class IndentationPatternConverter : PatternConverter
{
protected override void Convert(TextWriter writer, object state)
{
// do nothing - %indentation is used for indentation, so nothing should be written
}
}

public class IndentationPatternLayout : PatternLayout
{
private PatternConverter m_head;

public override void Format(TextWriter writer, LoggingEvent loggingEvent)
{
if (writer == null)
{
throw new ArgumentNullException("writer");
}
if (loggingEvent == null)
{
throw new ArgumentNullException("loggingEvent");
}

PatternConverter c = m_head;

IndentationWriter indentationWriter = new IndentationWriter(writer);
// loop through the chain of pattern converters
while (c != null)
{
if (c is IndentationPatternConverter)
{
indentationWriter.SetIndentation();
}
c.Format(indentationWriter, loggingEvent);
c = c.Next;
}
indentationWriter.Finish();
}

override public void ActivateOptions()
{
PatternParser patternParser = CreatePatternParser(ConversionPattern);

ConverterInfo converterInfo = new ConverterInfo()
{
Name = "indentation",
Type = typeof(IndentationPatternConverter)
};

patternParser.PatternConverters.Add("indentation", converterInfo);
m_head = patternParser.Parse();

PatternConverter curConverter = m_head;
this.IgnoresException = false;
}
}

public class IndentationWriter : TextWriter
{
TextWriter writer;
int indentation = 0;
List<string> lines = new List<string>();

public IndentationWriter(TextWriter writer)
{
this.writer = writer;
}
public override Encoding Encoding
{
get { return writer.Encoding; }
}

public override void Write(string value)
{
string[] values = value.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
for (int i = 0; i < values.Length; i++)
{
if (i > 0) values[i] = Environment.NewLine + values[i];
}
lines.AddRange(values);
}

public void Finish()
{
for (int i = 0; i < lines.Count; i++)
{
string line = lines[i];
if (i < lines.Count - 1) line = lines[i].Replace(Environment.NewLine, Environment.NewLine + new string(' ', indentation));
writer.Write(line);
}
lines.Clear();
}
public override void WriteLine(string value)
{
this.Write(value + Environment.NewLine);
}

public void SetIndentation()
{
foreach (string line in lines)
{
indentation += line.Length;
}
}
}

关于log4net - 如何在log4net的多行日志条目中添加缩进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15927351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com