2016-02-27 2 views
0

Я написал простое расширение, которое должно позволить мне вызвать метод GetLogger в любом классе.log4net и метод расширения C# | производительность

static class Log4NetExtension { 
    public static ILog GetLogger(this object cls) { 
     return LogManager.GetLogger(cls.GetType()); 
    } 
} 

Таким образом, я могу войти в другой класс следующим образом:

class Test1 { 
    public void method() { 
     this.GetLogger().Fatal ("Lorem ipsum no dolor..."); 
    } 
} 
class Test2 { 
    public void method() { 
     this.GetLogger().Error("Lorem ipsum no dolor..."); 
    } 
} 

Мой вопрос, что делает именно LogManager.GetLogger() вызов метода? Создает ли он журнал каждый раз при вызове метода? Оказывает ли такой подход большое влияние на мое приложение, если я так называю this.GetLogger()?

+4

Не ответ на ваш вопрос, но почему бы вам не вводить «ILogService» в свои классы, которые требуют регистрации? Что произойдет в 'myString.GetLogger()'? – MaYaN

+0

Это создаст новый Logger. Интересно, но как насчет создания интерфейса, который должен реализовать класс, если я хочу войти в этот класс. Тогда вы можете сделать что-то вроде публичного статического ILOG GetLogger (этот IMyType cls); –

+0

Взгляните на: https://github.com/NimaAra/Easy.Logger в проекте «Benchmarker», вы можете увидеть, как вводить «Log4NetService» в свои классы. – MaYaN

ответ

0

Это все основано от моего предположения, но ответить на этот вопрос ...

делает это создает регистратор каждый раз, когда на его вызов метода?

Этот регистратор, скорее всего, следует шаблону singleton, который создаст экземпляр сам по себе, если он не существует. Затем после этого, если вызывается какой-либо новый вызов getLogger, он вернет активный экземпляр. Регистратор создается только один раз.

Этот подход оказывает большое влияние на мое приложение в случае, когда я называю this.GetLogger() регулярно?

Если приведенное выше предположение подтвердилось, то на вашу программу должно быть мало влияния. Большинство однопоточных регистраторов обычно следуют шаблону singleton. Если вы работаете с несколькими потоками, это становится немного сложнее.

+0

Согласно документации @RyanR и Log4net, ваше предположение оказалось правильным. ;) –

0

В соответствии с Log4net documentation звонок GetLogger() будет искать регистратор с таким именем (имя класса, которое вы предоставляете), и создавайте его только в том случае, если оно не существует. Речь идет о лучшей производительности, которую вы собираетесь получить - ленивом создании регистратора, только если этого еще не было.

Смежные вопросы