Таким образом, моя проблема связана с ведением журналов и обработкой операторов журналов, которые могут повлиять на ваш код и поведение во время выполнения.
Файлы журналов ... каждая программа должна писать их для правильного решения проблем, нокак это сделать правильно?
Большинство операторов журнала очень дорогие, потому что они должны предоставлять полезную информацию, и они всегда создаются, даже если регистрация отключена.
Регистрация может бытьнастраивается с помощью xmls, inCode или в некоторых настройках и т. д., но это не решает проблему построения строк.
Например, следующий код всегда загружает огромное лениво загруженное дерево, которое никогда не будет загружено полностью во время обычного выполнения.
Все дерево создается только для того, чтобы этот оператор ведения журнала отображался в файле журнала
( Хорошо, я знаю ..., но это всего лишь замена для всехсложные методы ведения журнала, которые существуют в большинстве программ, которые никогда не должны выполняться во время выполнения обычного выпускаion )
public void SomeMethod(){
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
}
Метод someObject.GetHeavyDescriptionFromLazyTree()
всегда вызывается, даже если ведение журнала отключено, поэтому существуют некоторые общие решения этой проблемы, такие как:
public void SomeMethod(){
#if DEBUG
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
#endif
}
public void SomeMethod(){
if(logger.DoLogDebug())
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
}
Iдумаю, ясно, что флаг компилятора #if DEBUG
не является решением для производительного кода.Если я использую logger.DoLogDebug()
, будет слишком много кода для проверки, включено ли ведение журнала ... так что это тоже не может быть решением.
Я думал, что ConditionalAttribute
может помочь, но он также связанна флаги компилятора, и он не деактивирует вызов GetHeavyDescriptionFromLazyTree
[Conditional("DEBUG")]
public void Debug(string debugMessage)
{
Console.WriteLine(debugMessage);
}
Так что я ищу решение для ведения журнала, которое
- не чрезмерно обрезает мой источниккод с операторами отладки
- , где уровень ведения журнала определяется во время выполнения, а не во время компиляции
- , где операторы разрешаются только в случае необходимости (logLevel >finedLogLevel)
Extraloglines для лучшего ответа; -)
Отредактировано: я ищу решение в .NET 2.0