Какая точка лесозаготовительного фасада?

Существует множество различных журнальных библиотек, каждый из которых имеет свой собственный набор особенностей и преимуществ. (Примеры .Net: log4net, System.Diagnostics.TraceSource, nLog и т.д.)

Естественная склонность - отвлечь эти причуды и использовать лесозаготовительный фасад. (примеры: Castle.Services.Logging, Common.Logging, Simple Facging Facade) Таким образом, если определенная структура ведения журналов, которую вы используете, устарела, или другой входит в моду, вы можете просто замените реализацию и оставьте код нетронутым.

Но есть несколько логических фасадов на выбор. Учитывая, что ответ на множество разрозненных реализаций каротажа был абстракцией, почему бы не использовать фасад фасада лесозаготовки? Если это звучит смешно, что делает его более смешным, чем оригинальный фасад лесозаготовки? Что делает дополнительный слой абстракции сверху рамки ведения журнала магическим числом?

Ответ 1

Я буду говорить в основном с точки зрения использования абстракции, чтобы изолировать код приложения от конкретной структуры ведения журнала. Существуют и другие факторы, которые могут повлиять на один выбор структуры ведения журнала или один выбор (и требований для) абстракции.

Недавно я потратил много времени на оценку различных фреймворков регистрации, а также абстракции журналов третьей стороны.

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

Очевидно, это позволяет не привязываться к определенной структуре. Это важно? Вы когда-нибудь действительно отключите свою систему ведения журнала? Ну, есть также много людей, которые либо не упоминают обертку, либо тех, кто рекомендует против нее. Если вы посмотрите на некоторые из приведенных здесь примеров кода каротажа фреймворка, вы также можете увидеть множество примеров того, почему, по крайней мере, некоторые люди не должны обертывать свою систему ведения журнала!

Если вы недавно запустили проект, возможно, вы рассмотрели рамки ведения журнала и, возможно, сузили его до двух финалистов: log4net и NLog. У каждого есть аргументы в свою пользу. log4net явно является фаворитом, возможно, любимым из тех, кто выразил свое мнение. NLog предоставляет очень схожие возможности. Судя по популярности, log4net может быть ясным выбором. Основываясь на возможностях, они кажутся очень похожими. Основываясь на "недавней деятельности" (как указано в проверочных сообщениях на их реплики исходного кода в результате активности блога или отсутствия в нем), NLog будет четким выбором. Если вам нужно было выбрать год назад, вы можете пойти с log4net, так как это будет "безопасный" выбор. Неясно, когда NLog выпустит. В течение года NLog пережил довольно значительный цикл разработки, выпустив бета-версию всего несколько дней назад.

Что выбрать год назад? Что выбрать сейчас? Был ли тогда выбор лучше? Это лучший выбор сейчас?

Одна вещь, которую вы получаете от абстракции, - это способность отложить решение о том, какой из них выбрать (вам необязательно даже выбирать КОГДА-ЛИБО, хотя вы, вероятно, захотите, если вы планируете доставить систему ведения журнала с вашим продуктом). Вы можете протестировать диск, а затем другой, и почувствовать, как они работают с вашим приложением, с вашей командой, в вашей среде. Используя что-то вроде Common.Logging или SLF позволяет начать писать код сейчас, кодировать некоторые интерфейсы /API ведения журнала и получать код регистрации на месте. Если вы считаете, что интерфейс /API предоставлен абстракцией, достаточно для вашей работы (и, почему бы и нет, так как она по сути такая же, как интерфейс /API, предоставляемый log4net и NLog), тогда не так много опасность использования абстракции. По мере прохождения цикла разработки вы можете обнаружить, что один фреймворк или другой лучше подходит для ваших нужд. Записав абстракцию, вы можете сделать выбор в любой момент, вплоть до того момента, когда ваш продукт выйдет за дверь.

Вы даже можете подумать, в глубине души, что вы могли бы написать журнал регистрации с нуля. Опять же, если вы считаете, что интерфейса /API log4net и/или NLog достаточно, вы можете реализовать свою библиотеку ведения журнала с аналогичным API. Если вы считаете, что это может быть другой причиной использования абстракции. Опять же, вы можете начать писать код (для своего продукта, а не вашей библиотеки журналов) сегодня, регистрируясь с какой-либо другой структурой ведения журнала до тех пор, пока ваша библиотека журнала "с нуля" не будет готова. Возможно, вы действительно хотите использовать System.Diagnostics.TraceSource и Ukadc.Diagnostics(чтобы получить возможности форматирования вывода, похожие на log4net или NLog), чтобы вы могли получить "лучшую" интеграцию с протоколированием, которое Microsoft реализовала на некоторых своих платформах с помощью TraceSources. Было бы довольно легко написать "logger" в терминах TraceSources, а затем написать абстракцию, чтобы вы могли подключить ее к Common.Logging или SLF. (Если интерфейса /API достаточно, вы можете просто написать свой "регистратор" в терминах интерфейса библиотеки абстракции и не писать дополнительный слой абстракции).

С такими убедительными аргументами, как эти, почему кто-нибудь когда-либо НЕ использовал абстракцию? Ха-ха, просто шучу!

Если абстракция хорошая, вы должны написать свою собственную или использовать существующую? Если вы пишете один по своему усмотрению, то вам, очевидно, придется его написать. Как это сделать? Ну, вы можете просто определить интерфейс и обернуть один фрейм (будьте осторожны и оберните его правильно!). Позже, если вы решите, что хотите переключиться, оберните эту структуру. Если вы будете осторожны, вам не нужно менять код приложения, за исключением, возможно, места, где вы фактически создаете базовые объекты инфраструктуры. Может быть, это хорошо. Вы избегали зависимости от некоторой абстракции третьей стороны за "небольшую" цену реализации одной обертки над единой структурой. Однако есть стоимость. Пока вы не написали свою абстракцию, вы не можете написать много кода приложения, в котором есть вход в систему, если у вас нет хорошей стратегии для ее изменения в вашей абстракции. Также становится сложнее протестировать два или более фреймворка, чтобы решить, какой из них лучше подходит для вас. Каждая структура, которую вы хотите "попробовать", требует другого задания на перенос. Если вы хотите легко переключаться между каркасами (по крайней мере, во время цикла разработки), у вас есть работа, чтобы сделать это легко. Сторонние структуры предоставляют это из коробки.

Ничего себе! Теперь я продаюсь! Дайте мне абстракцию регистрации или дайте мне смерть!

Записывают ли абстракции весь соус? Есть ли недостаток? Они не могут Это здорово, не так ли?

Ну, как всегда, когда вы покупаете что-то или получаете что-то бесплатно, вы получаете то, что доступно. Абстракции регистрации ничем не отличаются. Ни Common.Logging, ни SLF не предоставляют хотя бы один очень важный набор возможностей log4net/NLog - возможности контекста ведения журнала (GDC, MDC, NDC). Они могут быть ключом к получению адекватной информации, зарегистрированной и отформатированной, чтобы вы могли получить максимальную отдачу от своего. SLF не предоставляет абстракцию TraceSource. Он также не предоставляет функции IsXXXEnabled. Common.Logging обеспечивает абстракцию TraceSource. Castle.Logging DOES выставляют GDC/MDC/NDC для log4net и NLog. Он также обеспечивает абстракцию TraceSource. Замок TraceSource абстракции также улучшает ведение журнала TraceSource, предоставляя "иерархическую" возможность именования, аналогичную той, которая предоставляется log4net и NLog. Это выглядит довольно круто!

Кроме того, все эти проекты открываются в той или иной форме. Таким образом, в зависимости от абстракции разработчики могут иметь более или менее заинтересованность в обновлении и добавлении новых функций. Common.Logging прошел через несколько версий и используется AFAIK в Spring.Net. Кажется разумным, хотя бы исторически. Castle.Logging используется в рамках Castle. Таким образом, у них, по-видимому, есть "настоящие" клиенты и они получают "реальный мир", что, надеюсь, приведет к большей реализации функций. SLF, насколько я могу судить, не используется как часть "реальной" платформы разработки, поэтому трудно сказать, насколько она реализована.

Неясно, какая дорожная карта для этих платформ. Common.Logging имеет некоторые предстоящие функции, перечисленные на их веб-сайте, но не ясные указания, когда они будут доступны. Веб-сайт говорит "Июнь", но в каком году? Как часто отслеживается список рассылки? Что касается SLF, как часто их контрольный код проверяется? Где приоритет этих "свободных" проектов оценивается по сравнению с оплачиваемыми рабочими местами разработчиков? Можете ли вы позволить себе какую-то стороннюю абстракцию для реализации функции, которая вам нужна? Будут ли они восприимчивыми, если вы что-то реализуете, а затем отправляете их на рассмотрение для включения в продукт?

С положительной стороны доступен весь источник для всех этих абстракций, поэтому вы можете просто взять на себя ответственность за это и внести какие-либо исправления или добавить какие-либо улучшения, которые вам, не требуя времени и энергии создания абстракция с нуля. Вам нравится Common.Logging, но действительно хотите log4net/NLog GDC/MDC/NDC? Получите реализацию замка и добавьте его в Common.Logging. Вуаля! Аббревиатура регистрации, которая содержит почти 100% API log4net/NLog logging. Вы предпочитаете SLF, но хотите, чтобы у него был IsXXXEnabled? Не так много работы для реализации этого. Идите дальше и придерживайтесь GDC/MDC/NDC, пока вы на нем. Вам нравится замок? (Я не знаком с этим, не знаю, как легко использовать за пределами замка, если это имеет значение) Будьте осторожны, я не использовал его, но, глядя на источник на git, он выглядит как Аббревиатура NLog logger может не содержать информацию о сайте сайта.

Является ли этичным принимать участие в нескольких проектах с открытым исходным кодом и комбинировать их с тем, чтобы сделать один "супер" проект (для вашей собственной или вашей компании)? Неправильно ли принимать Common.Logging и дополнять его реализацией Castle GDC/MDC/NDC? Я не знаю. Я позволю кому-то ответить на это.

Я почти закончил...

Некоторые абзацы регистрации сторонних сторон предоставляют другие возможности. Вы можете использовать библиотеку, которая реализована с точки зрения, скажем, log4net. Возможно, вы не захотите использовать log4net или, по крайней мере, можете не привязываться к нему. Common.Logging(и, возможно, SLF) позволяет вам легко записывать сообщения журнала log4net и перенаправлять их через абстракцию, чтобы они были захвачены в абстракции, лежащей в основе потока ведения журнала каротажа. SLF может обеспечить что-то подобное. Конечно, вы можете сделать что-то подобное с существующими фреймворками регистрации, либо из коробки, либо путем написания пользовательского лог4net Appender, NLog Target или System.Diagnostics TraceListener. Эти особенности не очень сильно выросли в моей конкретной оценке того, следует ли использовать абстракцию третьей стороны в моем проекте, потому что меня интересует просто абстракция.

Итак, где я стою? Я думаю, что есть ценность в том, чтобы ваш код приложения изолирован от конкретной структуры ведения журнала. Для меня Common.Logging выглядит как твердый выбор абстракции, хотя некоторые важные функции отсутствуют (GDC/MDC/NDC), и это не совместимо с Silverlight. Вскоре эти функции стали доступны. Мне комфортно с внедрением GDC/MDC/NDC, если мне нужно. Сочетание Silverlight совместимо, вероятно, потребует больше усилий, прежде всего потому, что я не особенно разбираюсь в С#/. NET/Silverlight. Пока эти проблемы не будут устранены, мы сможем написать много кода приложения с Common.Logging. Мы можем потратить свое время на разработку нашего приложения, а не на разработку еще одной библиотеки журналов или библиотеки абстракции. Если мы в конечном итоге должны добавить эти недостающие функции, нам нужно было бы многое сделать, если бы мы сами реализовали библиотеку протоколирования или библиотеку абстракции.

Ответ 2

Я думаю, что делает одно (уровень абстракции) магическим числом здесь, что Zero слишком мало, а Two слишком много.

Обмен журналом позади фасада логатора (количество уровней: 1) может привести к некоторым преимуществам пользователя, например, новый регистратор может сделать то, что не может сделать старый регистратор. Я могу себе представить, что это может быть производительность, поддержка определенных типов приложений и т.д.

Намного сложнее представить, как пользователь может воспользоваться заменой фасада логатора (количество уровней: 2).

(И если количество уровней равно 0, то это, вероятно, просто плохой объектно-ориентированный дизайн: у вас будет тысячи мест в вашем коде, на которые ссылается регистратор, и что, если есть разрывное изменение в следующей версии регистратор.)

Сделка с фасадами логов, по-видимому, заключается в том, что вы должны выбрать один из сторонних вариантов или создать свой собственный и подготовиться к тому, чтобы придерживаться его в течение длительного времени.

Ответ 3

До тех пор, пока NLog и log4net не предоставят интерфейс, который можно использовать вместо конкретных классов, я всегда абстрагировал их за свой собственный интерфейс и класс-оболочку.

Почему?

Чтобы получить наибольшее количество тестовых покрытий для всех пользовательских требований, особенно если эти требования охватывают протоколирование.

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

Затем они могут быть утверждены, и если изменение кода нарушит регистрацию, ваши тестовые тесты будут охватывать его.

Если NLog или log4Net должны были предоставить интерфейс для своих логгеров, тогда мне не нужно было прилагать усилия для обеспечения интерфейса и класса-оболочки, поскольку я мог просто издеваться над их интерфейсом для тестов.

Ответ 4

Это не волшебное число, это зависит от того, насколько вы гибки. Если вы подумаете об изменении фасада бревна, вы должны написать фасад фасада. Если вы думаете об изменении только журнала, вам нужен один фасад. Если вы не думаете ни о чем, не используйте фасад.

Недостаток, как вы сказали, - это особые способности. Если вы используете их, напишите свой собственный фасад.

Ответ 5

В моем проекте я использую System.Diagnostics.Trace.TraceError(...), System.Diagnostics.Debug.Print(...) как фасад для ведения журнала. Для организации (записи) журналов я использую NLog, т.е. В app.config. У меня есть конфигурация для NLog и перенаправление трассировки .net на NLog.

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <targets>
     <target name="file" xsi:type="File"
      layout="${longdate:universalTime=true}Z [${threadid}] ${pad:padding=5:inner=${level:uppercase=true}} ${logger} ${message}"
      fileName="${basedir}/App_Data/logfile.txt"...
   </targets>
</nlog>
<system.diagnostics>
  <trace>
    <listeners>
      <add name="nlog" type="NLog.NLogTraceListener, NLog" />
    </listeners>
  </trace>
</system.diagnostics>

Это не связывает меня ни с одним регистратором. Когда я отправляю свои компоненты клиентам, они могут использовать любой регистратор, который им нравится. Использование определенного регистратора в приложении может вызвать проблемы, то есть вы можете использовать nlog, но ваши клиенты используют log4net.

Ответ 6

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

Короче говоря, , вы не хотите принудительно выполнять свою реализацию регистрации на своих пользователях библиотеки. Использование хорошо подобранного фасада означает, что они смогут обрабатывать ваши журналы журналов с помощью своей собственной выборки и не должны проходить какие-то странные исключения и лазейки зависимостей, чтобы обеспечить совместную работу вашей системы ведения журнала и их.

Ответ 7

В этом примере вам нужен только один уровень абстракции, чтобы иметь возможность поменять ваш регистратор.

Какое дополнительное преимущество могло бы поменять ваш фасад лесозаготовки?

Ответ 8

Он может использоваться в протоколе для плагина. Вместо того, чтобы говорить use Some3rdParty.dll and MyPlugingApi.dll, я бы документировал только MyPlugingApi.dll. Интерфейс фасада журнала предлагает и документирует некоторые виды использования, которые, вероятно, приведут к чтению журналов и достаточно хорошей производительности регистрации. И, конечно, внесение изменений не приведет к изменениям API плагина.

Зачем нужно менять реализацию? Это может произойти, если в текущем режиме медленнее запускаться из конфигурации или замедлять запись записей, желая расшириться, чтобы сократить версию .NET, которая не нуждается в третьей стороне, интегрируя ее с другой кодовой базой, в которой используются другие авторы журналов.

Я также написал еще один facade, который является потомком мыслей в этом ответе.

Ответ 9

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

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

Хотя это и прецедент для нас, это на самом деле не наш основной случай использования. Мы хотим больше рамки инструментов, чем протокольный, что позволит нам сообщать о вещах, представляющих интерес, - даже тех, о которых мы не думали во время реализации.

Например, нашему приложению не требуется "сообщение" для сопровождения события; вместо этого наш "регистратор" будет принимать перечисления, определяющие типы событий и объекты состояния, представляющие специфику (например, временные метки или другие значения), и будет сериализовать их, чтобы облегчить отчетность, первичную аналитику, показатели деловой ценности и т.д., в дополнение к поддержке традиционных судебно-медицинская экспертиза. (Мы осознаем, что на самом деле мы делаем традиционную судебную экспертизу немного сложнее в интересах простого в использовании и понимающего интерфейса ведения журнала, что увеличивает вероятность того, что мы действительно будем использовать его и использовать его чаще).

Итак, чтобы дать вам краткий ответ кратко, вот примерный порядок преимуществ, которые, как мы чувствуем, мы получаем от использования фасада лесозаготовки.

  • Согласованный, специально разработанный интерфейс, облегчающий аппаратуру (в отличие от традиционных протоколов, как обсуждалось выше).
  • Макетные контрольные точки
  • Реализации внедряемых журналов подходит для всего: от локальной разработки до соединений AWS S3 или DB, в зависимости от развертывания (наше приложение использует Autofac с интродукцией зависимостей конструктора)
  • Заменимые рамки регистрации, позволяющие нам в будущем измениться на другую структуру журналов, если захотим. (Кстати, мы этого не видим, поэтому само по себе не убедили бы нас в использовании фасада.)

И, наконец, 0 фасадов потеряли бы эти преимущества, а 2 фасада не добавили бы к каким-либо из этих преимуществ, так что 1 фасад будет правильным номером для нас.

Отличный вопрос, @brian!:)