Моя структура ведения журнала навсегда связана с моим приложением! - PullRequest
9 голосов
/ 13 февраля 2011

Хорошо, так что я смотрю на NLog. В зависимости от использования мое приложение будет привязано к структуре ведения журнала. Как мне это преодолеть?

Кроме того, при использовании NLog мне приходится писать слишком много monkey-code для каждого класса, на котором я использую этот фреймворк. Полезно ли создавать один статический класс и получать к нему доступ из любого места моего приложения?

пример:

//the monkey code
private static Logger logger = LogManager.GetCurrentClassLogger();

//the coupling.
logger.Log(/*...*/);

Ответы [ 2 ]

7 голосов
/ 13 февраля 2011
  1. Создайте собственный интерфейс ведения журнала:

    public interface IMyOwnLogger {
        void Log(string message);
    }
    
  2. Создать реализацию:

    public class NLogLogger : IMyOwnLogger {
        void Log(string message) {
            StackFrame frame = new StackFrame(1, false);
            Logger logger = LogManager.GetLogger(frame.GetMethod().DeclaringType.FullName);
            logger.Log(/*...*/);
        }
    }
    
  3. Bind IMyOwnLoggerNLogLogger в вашем контейнере IOC.

  4. Внедрить, где необходимо (или использовать IOC.Get<IMyOwnLogger>()).

РЕДАКТИРОВАТЬ:

Идса прокомментировала потерю класса вызова.Помните, что вы всегда можете использовать трассировку стека:

var method = (new StackTrace()).GetFrame(1).GetMethod()

и извлекать оттуда вызывающий класс.

РЕДАКТИРОВАТЬ:

Вот как GetCurrentClassLoggerв NLog выглядит так, поэтому использование StackTrace в нашем классе не создает дополнительных издержек:

[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
    #if SILVERLIGHT
    StackFrame frame = new StackTrace().GetFrame(1);
    #else
    StackFrame frame = new StackFrame(1, false);
    #endif

    return globalFactory.GetLogger(frame.GetMethod().DeclaringType.FullName);
}
2 голосов
/ 13 февраля 2011

Лично я не привязываю какие-либо рамки ведения журналов к своему коду, используя TraceSource для инструмента моего кода.Затем я использую каркас журналирования (обычно блок приложения журналирования Enterprise Library), чтобы «прослушивать» трассировку вывода во время выполнения и делать с этой информацией все необходимое.(т.е. писать в базу данных, отправлять электронные письма и т. д.)

...