Подтвердить что ты не робот

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

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

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

loggingEvent.Level можно проверить в функции Format. Возможные значения: среди прочего, Info, Debug, Error, Verbose, есть больше, но это те, которые я буду использовать в основном.

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

Log.Info log.debug Log.Warn Log.Error

Как вы можете видеть - без подробностей!

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

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

4b9b3361

Ответ 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);
    }
}