2011-01-15 2 views
1

Я вижу, что LogNet обычно создается с помощью статической переменной:Log4Net и потребление памяти

static logger = LogManager.GetLogger(frame.GetMethod().DeclaringType); 

Глупый вопрос, но:

1) Не является ли это немного раздражает --- то есть. У меня должен быть этот беспорядок вызова в каждой части журнала моего кода.

2) Не создает ли это слишком много накладных расходов на память, т.е. Каждый из моих классов будет связан с отдельным классом ведения журнала. 300 классов, использующих протоколирование, заставят использовать 300 протоколирующих статических переменных? Кажется странным.

+0

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

+0

Ну, это все еще кажется болью с точки зрения кодирования ... Например, я должен помнить, чтобы каждый раз регистрировать журнал как «статический». Если я забуду это, я получаю штраф за исполнение. Есть ли обман, чтобы избежать этой проблемы или упростить ее? –

+2

Не уверен в этом, но метод * GetLogger() * ** может быть ** должен возвращать тот же журнал, если вызван с тем же аргументом. Поэтому, если у вас 300 экземпляров класса, у вас должен быть один логгер для всех них. –

ответ

0

Вам не нужно/должна использовать статическую переменную. Обычно мои классы будут выглядеть как

public class Foo 
{ 
    private ILog Logger; 

    public Foo() 
    { 
     Logger = LogManager.GetLogger(GetType()); 
    } 

    //rest of class here 

} 

Это довольно чистое и пока у меня есть проблемы с памятью, нет никакого смысла в начале использования оптимизации памяти приложения. Однако не все мои классы выполняют протоколирование, поэтому только те, которые делают/должны будут иметь этот бит кода в них. Если все ваши классы записываются в журнал, это звучит так, будто вы можете перехватывать журнал, либо это, либо вы имеете дело с довольно большим приложением (в зависимости от того, что у вас есть 300 классов, записывающих в журнал). Если в дальнейшем это так, то 300 экземпляров журнала, вероятно, не являются значительной частью вашего использования памяти.

У вас есть возможность настроить ваш регистратор как именованный экземпляр ILog Logger = LogManager.GetLogger("MyNamedLogger"); вместо этого и использовать этот экземпляр «named» ILog для нескольких классов. Обратите внимание, что вы потеряете часть полезности зарегистрированных сообщений из-за того, как обычно записываются сообщения журнала. Вы могли бы компенсировать это несколькими способами.

+0

-1 для нестатического предложения (оставляя такое же количество кода проводов), +1 для упоминания именованного экземпляра;) –

+0

@ KenHenderson: не нужно использовать статику, как указал StefanEgli в его ответе. Log4Net имеет пул имен Loggers. – Askolein

+0

@Askolein - моя первая строка упоминает, что вам не нужна статическая переменная. Не могли бы вы сказать мне, в какой части ответа упоминается/подразумевается использование статики, чтобы я мог обновить его, чтобы правильно отразить намерения моего ответа. –

2

log4net поддерживает репозиторий журналов, вам не нужно ставить их. Рекомендуется использовать именованный логгер для каждого класса, поэтому вам не нужно беспокоиться о «накладных расходах» на наличие нескольких сотен регистраторов в памяти. Если это проблема, вам, вероятно, потребуется полностью удалить протоколирование.

Ведение журнала беспорядочно, т. Е. Он загромождает ваш код тем, что не является частью бизнеса. Программирование ориентированного направления может помочь вам there.

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