.net - log4net是否支持在日志消息中包括调用堆栈

标签 .net debugging log4net

我希望在log4net消息中包括调用堆栈(例如,调用我的方法)。有这样做的标准方法吗?

(我知道这会很慢,但是我只需要在出现某些错误时这样做即可)

最佳答案

是的-您可以在模式布局中使用以下模式获取此堆栈信息:

%type %file %line %method %location %class

有关更多信息,请参见PatternLayout上的this文档。

编辑以回应Ian的以下评论:我不认为log4net可以配置为写出整个堆栈。

您可以始终使用new StackTrace().ToString()之类的东西自己写出来,但是我想您问的原因是您希望它可以在日志记录配置中进行配置。

我将进行更深入的了解,但是我的直觉是无法配置此方法,最终您将不得不实现自己的Layout类。

编辑++
OK-这是一个自定义模式布局类,该类派生自PatternLayout,但添加了布局%stack。

这段代码有点粗糙-仅作说明-尚未准备好生产! (例如,您可能没有安全权限来访问要打印的堆栈)
public class CustomPatternLayout : PatternLayout
{
    public CustomPatternLayout()
    {
        this.AddConverter("stack", typeof(StackTraceConverter));
    }
}

public class StackTraceConverter : PatternLayoutConverter
{
    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
    {
        var stack = new StackTrace();

        var frames = stack.GetFrames();
        for (var i = 0; i < frames.Length; i++ )
        {
            var frame = frames[i];

            // if the stack frame corresponds to still being inside the log4net assembly, skip it.
            if (frame.GetMethod().DeclaringType.Assembly != typeof(LogManager).Assembly)
            {
                writer.WriteLine("{0}.{1} line {2}",
                    frame.GetMethod().DeclaringType.FullName,
                    frame.GetMethod().Name, 
                    frame.GetFileLineNumber());
            }
        }
    }
}

然后,您可以使用以下模式配置对此进行配置(请注意布局末尾的%stack):
  <layout type="ScratchPad.CustomPatternLayout,ScratchPad">
    <conversionPattern value="%date %-5level %message%newline %type %file %line %method %location %class %stack" />
  </layout>

关于.net - log4net是否支持在日志消息中包括调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1906227/

相关文章:

.net - Visual Studio 2008 调试器不报告一些常见错误

Log4Net:滚动文件附加器,定义扩展名

c# - 为什么 IsDebugEnabled 在我的代码中总是 True?

.net - 使用 web.config 覆盖 machine.config

c# - 更新 IQueryable 对象中的值

c++ - 如何打印正在使用 LLDB 调试的 C/C++ 函数的内存地址和参数值?

c++ - CLion:通过添加源文件启用外部库的调试

c# - 服务器向 Nancy 发送事件

C#:如何在调用时触发事件的方法上创建属性?

c# - 如何使用使用参数化名称的 log4net RollingFileAppender 在最大文件上滚动?