Как регистрировать трассировку стека с помощью log4net (С#)

Как регистрировать трассировку стека с помощью log4net? Я использую .Net версию.

У меня у меня есть Log.Error(ex).

Спасибо

Ответы

Ответ 1

Используйте это:

void Error(object message,Exception t)

Причина в документации log4net для void Error(object message):

ПРЕДУПРЕЖДЕНИЕ Обратите внимание, что при передаче Исключения этому методу будет напечатано имя Исключения, но нет трассировки стека. Для печати трассировки стека используйте форму void Error(object,Exception).

Error(object message, Exception t) - самый гибкий способ записи данных исключения из-за того, что он используется как исключение, а не Object, и может использоваться в приложениях для сужения журналов в конкретном классе исключений (а не путем поиска строки, которая много медленнее и менее согласованно)

Существуют специальные версии всех неформатных методов ведения журнала, которые принимают сообщение и исключение:

namespace log4net
{
    public interface ILog
    {
        ...
        /* Log a message object and exception */
        void Debug(object message, Exception t);
        void Info(object message, Exception t);
        void Warn(object message, Exception t);
        void Error(object message, Exception t);
        void Fatal(object message, Exception t);
        ...
    }
}

Ответ 2

Вы должны убедиться, что определение шаблона макета структурировано для вывода того формата и данных, которые вы хотите.

Схема шаблона log4Net

Используется для вывода трассировки стека события регистрации. Спецификатор уровня трассировки стека может быть заключен между фигурными скобками. Например, % stacktrace {level}. Если не указан спецификатор уровня трассировки стека, то предполагается 1

Вывод использует формат: type3.MethodCall3> type2.MethodCall2> type1.MethodCall1

Эта схема недоступна для сборок Compact Framework.

Ответ 3

Существуют две основные формы: одна, которая явно принимает объект и исключение:

catch(Exception ex)
{
    // the form that takes two args has an exception as second, prints trace...
    _log.Error("My custom message", ex);
}

И тот, который принимает любой объект и выполняет на нем ToString():

catch(Exception ex)
{
    // the form that takes one arg uses ToString()
    _log.Error(ex);
}

Первая позволяет вам вначале добавить более значимое сообщение в запись в журнале, чтобы предоставить любую дополнительную информацию, которую вы хотите. Последний выполнит эту работу, но только распечатает сведения об исключении, используя ToString(), который дает вам:

Стандартная реализация ToString получает имя класса который выбрал текущее исключение, сообщение, результат вызова ToString для внутреннего исключения и результат вызова Environment.StackTrace. Если какой-либо из этих членов - Nothing, его значение не входит в возвращаемую строку.

Ответ 4

Просто try ... catch exception и укажите это исключение в методе ведения журнала:

try
{
  // ... code that throws exception
}
catch (Exeption ex)
{
  myLogger.Error(ex);
}

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

Ответ 5

Вы можете расширить ILog, чтобы иметь метод, который регистрирует только исключение с его трассировкой стека.

public static void ErrorWithStackTrace(this ILog log, Exception exception)
 {
    log.Error(exception.Message,exception);
   }

Ответ 6

public static Logger SetIfNeededAndGetLogger(string serviceName, string methodName)
{
    Logger logger = null;

    try
    {
        if (!string.IsNullOrWhiteSpace(serviceName) && !string.IsNullOrWhiteSpace(methodName))
        {
            ILog log = null;
            var traceSourceName = string.Format("{0}{1}", serviceName, methodName);
            if (!string.IsNullOrWhiteSpace(traceSourceName))
            {
                logger = LogSources.FirstOrDefault(x => x.ServiceLogType == traceSourceName);
                if (logger == null)
                {
                    log = LogManager.GetLogger(traceSourceName);
                    //logger = new Logger(log, IHEService.MediLogClientGuid, traceSourceName, methodName);
                    logger = new Logger(log, System.Guid.NewGuid(), traceSourceName, methodName);
                    SetLoggingSource(logger);
                }
            }
        }
    }
    catch (Exception)
    {
        //silent faiure
    }

    return logger;
}

private static void SetLoggingSource(Logger value)
{
    LogSources.Add(value);
}