Log4net, как регистрировать подробное сообщение?
Я могу записывать информационные сообщения без проблем, но не могу понять, как записывать подробные сообщения.
Любая помощь будет приветствоваться.
Моя проблема:
loggingEvent.Level можно проверить в функции Format. Возможные значения:
среди прочего, Info, Debug, Error, Verbose, есть больше, но это те, которые я буду использовать в основном.
Фактический объект журнала имеет только следующие методы:
Log.Info
log.debug
Log.Warn
Log.Error
Как вы можете видеть - без подробностей!
Итак, как я могу зарегистрировать подробное сообщение, это отличается от отладки
Заранее спасибо
Ответы
Ответ 1
Вы можете добавить уровень логов (или уровень трассировки) в log4net с помощью методов расширения. Это то, что я использую:
public static class ILogExtentions
{
public static void Trace(this ILog log, string message, Exception exception)
{
log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType,
log4net.Core.Level.Trace, message, exception);
}
public static void Trace(this ILog log, string message)
{
log.Trace(message, null);
}
public static void Verbose(this ILog log, string message, Exception exception)
{
log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType,
log4net.Core.Level.Verbose, message, exception);
}
public static void Verbose(this ILog log, string message)
{
log.Verbose(message, null);
}
}
Пример использования:
public class ClientDAO
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(ClientDAO));
public void GetClientByCode()
{
log.Trace("your verbose message here");
//....
}
}
Источник:
http://www.matthewlowrance.com/post/2010/07/14/Logging-to-Trace-Verbose-etc-with-log4net.aspx
Ответ 2
Apache log4net имеет следующие уровни журнала:
DEBUG < INFO < WARN < ERROR < FATAL
Для сообщений, которые считаются более подробными, чем информационные сообщения (INFO
), уровень DEBUG
- это вариант для перехода. Написание сообщений отладки должно быть таким же простым, как:
myLog.Debug("This is a pretty verbose message");
Если вы пишете очень много отладочных сообщений и/или сообщения дорогостоящие для производства (например, включает в себя сложную конкатенацию строк), подумайте о добавлении условного условия для ведения журнала:
if (myLog.IsDebugEnabled)
{
myLog.Debug("This is a pretty verbose message");
}
Если вы часто это делаете и хотите ПОЛУЧИТЬ свой код, подумайте об использовании методов расширения для отложенного форматирования сообщений, который будет приведенное выше утверждение:
Log.Debug( () => "This is a pretty verbose message" );
Ответ 3
Вы не можете понять, потому что AFAIK не существует "подробного" уровня в log4net. Есть ли в log4j?
Ниже приведены уровни
ALL
ОТЛАЖИВАТЬ
ИНФОРМАЦИЯ
WARN
ОШИБКА
FATAL
OFF
Информационные сообщения - это те, в которых вы указываете, что вы делаете в настоящее время в своем приложении. Те сообщения, которые выплевываются командами или инструментами ОС, когда вы говорите "-вербус", будут такими сообщениями.
Отладочные сообщения в основном предназначены для программистов, и они позволяют вам писать информацию, такую как создание переменных, жизненный цикл, трассировки стека исключений и т.д. Что-то, что интересует только программист/вспомогательный персонал.
[Изменить]
Просто подумал об этом. Вы можете очень хорошо добавить элемент switch или config в ваше приложение с именем "verbose", а затем высветить информационные сообщения, если установлено значение "true". Или завершите ведение журнала в вспомогательном методе, который будет регистрировать log4net, а также отправлять то же сообщение на консоль. Кроме того, вы можете использовать ConsoleAppender для регистрации сообщений на консоли. Я никогда не использовал его. Это то, что вы искали?
Надеюсь, что это поможет.
Ответ 4
Я не пробовал, но я думаю, что это должно быть довольно прямолинейно: внутри log4net знает уровень "verbose"; это только интерфейс ILog, который не раскрывает его. Поэтому для этого интерфейса должно быть довольно просто добавить метод IsVerboseEnabled и Verbose(). Конечно, вы должны быть готовы изменить исходный код log4net...
Ответ 5
Я тестировал log4net с помощью BasicConfigurator и записывал сообщения журнала, генерируемые для всех уровней от EMERGENCY до DEBUG, но не для TRACE или VERBOSE.
Мне нужно было выполнить приведенный ниже код для начала регистрации.
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
((Hierarchy)logRepository).Root.Level = Level.All;
Ответ 6
В случае, если кому-то еще нужен ответ (без использования System.Reflection)
Не нужно устанавливать DeclaringType, просто установите значение null (автоопределение в Lo4Net)
public bool IsVerboseEnable { get { return _log.Logger.IsEnabledFor(Level.Verbose); } }
public string Verbose(string text)
{
_log.Logger.Log(null, Level.Verbose, text, null);
return text;
}
Проверено и проверено
Использование кода в log4net
public virtual void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception)
{
try
{
if (this.IsEnabledFor(level))
{
this.ForcedLog((callerStackBoundaryDeclaringType != null) ? callerStackBoundaryDeclaringType : Logger.declaringType, level, message, exception);
}
}
catch (Exception exception2)
{
LogLog.Error(Logger.declaringType, "Exception while logging", exception2);
}
}