Ответ 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. Мы можем потратить свое время на разработку нашего приложения, а не на разработку еще одной библиотеки журналов или библиотеки абстракции. Если мы в конечном итоге должны добавить эти недостающие функции, нам нужно было бы многое сделать, если бы мы сами реализовали библиотеку протоколирования или библиотеку абстракции.