Вход в библиотеку C # - PullRequest
18 голосов
/ 04 мая 2010

Все,

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

Спасибо

М

Ответы [ 9 ]

22 голосов
/ 04 мая 2010

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

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

Редактировать:

  • Я бы также не посчитал хорошей практикой иметь журнал библиотеки в файле по умолчанию. Пользователи вашей библиотеки должны иметь возможность решать, где заканчиваются сообщения журнала.
  • Я бы также предоставил реализацию "без операций", которую можно использовать, если не требуется никакой регистрации. Вероятно, это должно быть поведение по умолчанию и не требовать каких-либо дополнительных сборок или шагов для реализации.
11 голосов
/ 04 мая 2010

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

Так что да, используйте log4net, следуя его рекомендуемым шаблонам (уникальный «регистратор» для каждого класса), и сообщите своим пользователям, что ваша библиотека использует log4net. Все сообщения журнала, которые генерирует код вашей библиотеки, будут маршрутизироваться в соответствии с конфигурацией потребителей (файл, база данных, консоль, трассировка и т. Д.).

РЕДАКТИРОВАТЬ: Вот хороший короткий учебник в log4net, который объясняет основные понятия.

3 голосов
/ 04 мая 2010

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

2 голосов
/ 04 мая 2010

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

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

1 голос
/ 03 февраля 2019

Я бы не хотел вводить зависимость от сторонней библиотеки, такой как log4net, в библиотеку классов общего назначения: я бы предпочел, чтобы вызывающая сторона решала, как вести запись в журнал. Что если пользователь библиотеки уже использует другую структуру ведения журнала?

Некоторые альтернативы:

  • В случае ошибок, бросьте Exception или разрешите распространяться одному, и позвольте вызывающей стороне обработать его и выполнить любую запись.

  • Для предупреждений (например, Исключение, которое вы обрабатываете в библиотеке), вы можете рассмотреть возможность вызова события, которое может обработать вызывающий, если он захочет зарегистрировать его. Например, вы можете вызвать событие Error, которое принимает System.IO.ErrorEventArgs (или аналогичный пользовательский EventArgs) с подробной информацией об ошибке.

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

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

  • Вы можете сделать что-то похожее на вход в AWS SDK для .NET , то есть поддерживать несколько каркасов журналирования, но загружать сторонние каркасы, используя отражение, чтобы не создавать зависимости. Лично мне это не нравится, но это правильный подход, особенно если ваша библиотека достаточно велика, чтобы оправдать подробное инструментирование.

1 голос
/ 03 февраля 2019

По моему мнению, никогда не помешает обернуть логи в свой маленький адаптер, например, чтобы потом легко убрать логи с производства. Для этого я создал небольшую оболочку для ведения журнала , ее API выглядит следующим образом:

Log.d("I'm a log message");
Log.w("I'm a warning with parmas", "param 1", 2, "..");
Log.e("I'm an error");
Log.e(new Exception("I'm an exception"));
AssertV2.IsTrue(1 + 1 == 3, "This assertion will fail");

См. https://github.com/cs-util-com/cscore#logging для дополнительных примеров

Вы можете войти в консоль, файл, Unity и легко добавить более сложные цели ведения журнала, например, например. Serilog

Дайте мне знать, если у вас есть предложения или другие отзывы, я хочу сохранить их как можно меньше, но хочу узнать о случаях использования это еще не охватило бы ?

0 голосов
/ 05 мая 2013

Я использую SmartInspect .

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

Кстати, я никак не связан со SmartInspect.

0 голосов
/ 04 мая 2010

Что ваши пользователи используют для входа в систему?
Это вопрос, на который вам нужно ответить, чтобы определить правильную основу.
Log4net является мощным и относительно простым из моей POV. Вы также можете использовать его для входа в потоковую запись, если ничего не указано.

0 голосов
/ 04 мая 2010

Это зависит от того, что вы хотите сделать.

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

Сначала вы должны ответить на эти вопросы, а затем решить, что регистрировать, где хранить и как его форматировать ...

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

С уважением Томас

...