Log4net, как записать подробное сообщение?

Я могу записывать информационные сообщения без проблем, но не могу понять, как записывать подробные сообщения. Любая помощь будет приветствоваться.

Моя проблема:

loggingEvent.Level можно проверить в функции Format. Среди возможных значений - информация, отладка, ошибка, подробный. Есть и другие варианты, но я буду в основном их использовать.

Фактический объект журнала имеет только следующие методы:

Log.Info
Log.Debug
Log.Warn
Log.Error

Как видите - многословия нет!

Итак, как я могу записать подробное сообщение, это отличается от отладки

заранее спасибо


person JL.    schedule 17.02.2010    source источник
comment
Короткий ответ: вы не можете этого сделать, если не поработаете с сантехникой. Возможно, это изменится в более поздних версиях. Этот вопрос был задан с учетом версии продукта 1.2.   -  person JL.    schedule 17.02.2010


Ответы (6)


Вы можете добавить подробный (или уровень трассировки) в 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

person Wagner Danda da Silva Filho    schedule 11.08.2010

Вы не можете понять, потому что, AFAIK, в log4net нет "подробного" уровня. Он есть в log4j?

Ниже приведены уровни

ALL DEBUG INFO WARN ERROR FATAL OFF

Информационные сообщения - это сообщения, в которых вы указываете, что вы делаете в своем приложении в данный момент. Эти сообщения, выдаваемые командами или инструментами ОС, когда вы говорите -verbose, будут такими сообщениями.

Сообщения отладки в основном предназначены для программистов, и они позволяют вам записывать такую ​​информацию, как создание переменных, жизненный цикл, трассировки стека исключений и т. Д. То, что будет интересно только программистам / сотрудникам службы поддержки.

[Edit] Просто подумал об этом. Вы можете очень хорошо добавить в свое приложение переключатель или элемент конфигурации с именем «verbose», а затем выводить информационные сообщения, если установлено значение true. Или оберните регистрацию вспомогательным методом, который будет регистрироваться в log4net, а также отправлять то же сообщение на консоль. Кроме того, вы можете использовать ConsoleAppender для записи сообщений на консоль. Но я никогда им не пользовался. Это то, что ты искал?

Надеюсь это поможет.

person Tanmay    schedule 17.02.2010
comment
Я обновил вопрос ... обратите внимание, что LoggingEvent имеет свойство уровня. Одно из возможных значений - подробный. - person JL.; 17.02.2010
comment
Извините, я не вижу такого возможного значения в SDK. logging.apache.org/log4net/release/sdk/log4net. Core.Level.html Не могли бы вы указать, откуда вы его берете? - person Tanmay; 17.02.2010
comment
Думаю, я понимаю, о чем вы говорите. OOB (из коробки) Log4net не имеет уровня подробного описания, скорее, он ссылается на все, что выше Info, что для всех практических целей означает отладку. вот почему вы можете проверить это только во время форматирования макета, верно? - person JL.; 17.02.2010
comment
См. Также изменение к моему ответу, в котором уточняются некоторые подробности. Кроме того, не могли бы вы объяснить, как вы различаете Info и Verbose? - person Tanmay; 17.02.2010
comment
@Tan может быть уверен: Log4net.Core.LoggingEvent.Level = Log4.net.Core.Level - person JL.; 17.02.2010
comment
Что ж, уровень, который вы упомянули в LoggingEvent, не имеет опции Verbose. Так вы думаете, что это должно быть, или мы смотрим на разные SDK? Или разные версии? - person Tanmay; 17.02.2010
comment
log4net.Core.Level действительно имеет Verbose как возможное значение в v1.2.10. - person adrianbanks; 17.02.2010
comment
С уважением, у меня есть следующие значения: Alert, ALL, Critical, Debug, Emergency, Error, Fatal, Fine, Finer, Finest, Info, Notice, Off, Severe, Trace, Verbose, Warn. Моя версия продукта - 1.2 - person JL.; 17.02.2010
comment
@adrianbanks Я тоже не думаю. Вот почему я указал на SDK. Но, возможно, JL использует такую ​​версию. Я до сих пор не понимаю, чем это будет отличаться от ИНФО. - person Tanmay; 17.02.2010
comment
@JL - Это очень интересно узнать. Цитирование строки из SDK. Каждый уровень помимо имени имеет DisplayName. DisplayName - это строка, которая записывается в выходной журнал. По умолчанию отображаемое имя совпадает с именем уровня, но его можно использовать для псевдонима уровней или для локализации вывода журнала. Так это псевдоним? - person Tanmay; 17.02.2010
comment
@Tanmay: документы SDK для версии 1.2.10 (logging.apache .org / log4net / release / sdk / log4net.Core.Level.html) не отображают все уровни, которые есть в моей версии 1.2.10. У меня те же уровни, что и @JL. - person adrianbanks; 17.02.2010
comment
@Tanmay, проблема в том, что свойство доступно только для чтения, поэтому к тому времени, когда оно попадет в средство форматирования, вы не сможете его установить. Но я думаю, что сейчас я просто буду регистрировать все сообщения INFO на 1 уровне. Я просто подумал, что Log4Net может иметь функциональность OOB для двух уровней информации. похоже, что вы правы, это просто не так. - person JL.; 17.02.2010

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" );  
person Jørn Schou-Rode    schedule 17.02.2010
comment
см. обновленный вопрос ... он более подробно объясняет проблему. - person JL.; 17.02.2010
comment
Ой, это кардинально меняет вопрос. Боюсь, я понятия не имею, что сейчас ответить = \ - person Jørn Schou-Rode; 17.02.2010
comment
Обратите внимание, что ILog.xxxxFormat() методы выполняют .IsxxxxEnabled внутреннюю проверку. - person Winston Smith; 20.04.2011

В случае, если кому-то все еще нужен ответ (без использования 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);
    }
}
person APAUL    schedule 03.11.2016

Я не пробовал, но думаю, что это должно быть довольно просто: внутренне log4net знает уровень «подробный»; его не раскрывает только интерфейс ILog. Поэтому добавить к этому интерфейсу методы IsVerboseEnabled и Verbose () должно быть довольно просто. Конечно, вам нужно быть готовым изменить исходный код log4net ...

person Stefan Egli    schedule 17.02.2010

Я тестировал log4net с помощью BasicConfigurator и при записи сообщений журнала генерировал вывод для всех уровней от EMERGENCY до DEBUG, но не для TRACE или VERBOSE.

Мне нужно было выполнить приведенный ниже код, чтобы они начали регистрацию.

var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
((Hierarchy)logRepository).Root.Level = Level.All;
person Alexandre    schedule 02.08.2017