Как регистрировать трассировку стека с помощью 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);
}