Делает поддержку log4net включая стек вызовов в сообщении журнала

Я хочу включать стек вызовов (например, методы, которые позвонили мне) в сообщении log4net. Существует ли стандартный способ сделать это?

(Я знаю, что это будет медленно, но я только должен сделать это на некоторых ошибках),

8
задан Peter Lillevold 15 December 2009 в 11:56
поделиться

2 ответа

Да - вы можете получить эту информацию о стеке, используя следующие шаблоны в макете шаблона:

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

Дополнительную информацию см. В this документации по PatternLayout.

Отредактируйте в ответ на комментарий Яна ниже: Я не думаю, что log4net можно настроить для записи всего стека.

Вы всегда можете вернуться к записи для себя, используя что-нибудь например new StackTrace (). ToString () , но я предполагаю, что причина, по которой вы спрашиваете, в том, что вы хотите, чтобы это можно было настроить в конфигурации ведения журнала.

Я посмотрю глубже, но мой интуиция кажется, что это невозможно настроить, и в конечном итоге вам придется реализовать свой собственный класс Layout.

Edit ++ Хорошо - вот класс макета пользовательского шаблона, который является производным от PatternLayout , но добавляет в стек% макета.

Этот код немного грубоват - только для иллюстрации - не готов к производству! (например, у вас может не быть разрешения безопасности для доступа к стеку, который вы пытаетесь распечатать)

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>
12
ответ дан 5 December 2019 в 08:24
поделиться

If you are catching exceptions, then just log Exception.ToString(), as that will contain the full stack trace, and will be available as the normal log message.

3
ответ дан 5 December 2019 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: