как записать имя метода при использовании класса-оболочки с Log4net - PullRequest
9 голосов
/ 19 июля 2009

Я использую пользовательский XML-форматер для log4.net

public class ISDSApplicationEventsLayout : XmlLayoutBase
{
    protected override void FormatXml(...)
    {
        //Location Info 
        writer.WriteStartElement("Method");
        writer.WriteString(**loggingEvent.LocationInformation.MethodName * *);
        writer.WriteEndElement();
    }
}

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

public static void logEvent(string message)
{
    log.Info(isdsLog); 
}

Я получаю вывод ....

  <Method>logEvent</Method>

Как можно иметь имя метода с именем logEvent, а не logEvent в качестве имени метода?

Спасибо

Обновление вопроса:

Если это выше кажется немного сложным - я действительно спрашиваю: как вы сохраняете контекст метода, который вызвал функцию регистрации обтекания в log4net ...

пример ... метод doWork () ... звонки -> оболочка регистрации -> звонки log4net ....

Как вы делаете methodname = doWork и НЕ регистрируете функцию оболочки журнала ....

Ответы [ 2 ]

16 голосов
/ 08 декабря 2010

На самом деле, вы можете легко это исправить с помощью готового log4net. Ваша оболочка может вызвать Logger.Log и передать тип вашего класса оболочки в качестве первого параметра. Итак, ваша обертка может выглядеть примерно так:

public class MyLog4NetWrapper
{
  ILog log = LogManager.GetLogger("WhateverYourLoggerNameIs");

  public void logEvent(string message) 
  {     
    log.Logger.Log(typeof(MyLog4NetWrapper), LogLevel.Info, message, null);
  } 
}

Когда log4net регистрирует сообщение, оно пересекает стек вызовов, пока не попадет в метод, тип объявления которого равен типу, переданному в качестве первого параметра метода Log. Следующий метод в стеке - это действительный сайт вызова.

Что касается упаковки log4net logger, я не уверен, что рекомендую создать статический класс-оболочку. Основная проблема заключается в том, что в вашем файле app.config может быть только один настраиваемый регистратор. Другими словами, вы не сможете самостоятельно контролировать ведение журналов из разных частей вашего кода. Если у вас есть класс A и класс B, и оба используют статический логгер, то оба класса будут вести журнал на одном уровне. Если вы хотите включить вход для класса A и выключить для класса B, вы не сможете этого сделать.

1 голос
/ 20 июля 2009

Не думаю, что вы можете легко это исправить с помощью готовой log4net. Если мы посмотрим на метод ILog.Info в классе LogImpl , который вы вызываете:

    virtual public void Info(object message) 
    {
        Logger.Log(ThisDeclaringType, m_levelInfo, message, null);
    }

Когда сообщение заносится в журнал, log4net обходит трассировку стека текущего вызова, чтобы найти метод, который инициировал операцию журнала. Для этого Log4net использует тип «ThisDeclaringType» в качестве границы поиска, в качестве метода инициации выбирается первый вызов «выше» в этом типе.

В вашем случае первый встреченный метод - метод logEvent. Если вы уронили оболочку logEvent и использовали методы ведения журнала напрямую, вы получите нужную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...