Я в основном хочу написать logger/tracer клиента, который также регистрирует имя класса и метода метода, вызывающего logger/tracer. Это должно быть быстрым, чтобы оно не влияло на производительность приложения, строго набиралось и очищалось. У кого-нибудь есть хорошие идеи?Каков наиболее эффективный способ регистрации имени класса и метода?
Вот несколько я имел, но я беспокоюсь о производительности из-за отражения: (? Слишком много накладных расходов)
StackTrace/StackFrame
MethodInfo.GetCurrentMethod() (все еще слишком медленно? и не очень чистый) метод
проход в качестве делегата (C# можно сделать это неявно и у меня есть доступ к MethodInfo, но не очень чистый)
Я ценю чьи-либо комментарии.
UPDATE:
мне понравилась cleanless из StackFrame поэтому я задал более конкретный вопрос here в отношении производительности StackFrame, и я получил некоторые действительно хороший ответ, включая тесты производительности. Оказывается, что MethodInfo.GetCurrentMethod()
является самым быстрым (занимает около 1 микросекунды на моем компьютере) и new StackFrame(1)
можно запросить по запросу (занимает около 15-20 микросекунд на моем компьютере). Я выбрал метод как вариант делегирования, поскольку он слишком запутан, когда метод имеет несколько параметров.
ВЫВОД:
Я смотрел на все варианты и лучше всего написать специальный плагин для PostSharp, который впрыскивает имя метода в виде строки в MSIL во время компиляции при применении пользовательского атрибута, как [Trace]
. На мой взгляд, это самый быстрый и удобный вариант. Это даже позволяет намного больше вещей, например, передавать имена параметров и аргументы без каких-либо отражений, а также исключать и регистрировать исключения. Это my related question для получения дополнительной информации.
Могу ли я спросить, почему вы не хотите использовать log4net? – nWorx
Мне не нравится слишком полагаться на другие компоненты. А также в случае log4net это слишком сложно. – 2009-08-28 20:44:09
Германн, это, как правило, упоминается в нашей отрасли как «не придуманный здесь синдром», и его лучше всего избегать. Вот ссылка на Википедию с дополнительной информацией об этом несчастье: http://en.wikipedia.org/wiki/Not_Invented_Here –