Почему следует избегать использования Console.WriteLine в коде библиотеки? - PullRequest
0 голосов
/ 09 мая 2020

При написании библиотеки для использования другими C# приложениями (некоторые веб-приложения, некоторые AWS лямбда-выражения), каковы недостатки записи сообщений на консоль? Сообщения будут редкими и ненужными для работы, но помогут отладить необычный сценарий ios, если бы разработчик имел доступ к журналам.

Документация на System.Console говорит:

Не используйте класс Console для отображения вывода в автоматических приложениях, таких как серверные приложения. Вызов таких методов, как Console.Write и Console.WriteLine не имеет эффекта в GUI приложениях.

Но не объясняет почему.

1 Ответ

7 голосов
/ 09 мая 2020

Использование Console.WriteLine в библиотеке тесно связывает вашу библиотеку с stdout и предполагает, что вызывающий код (приложение, использующее вашу библиотеку) обращает внимание на stdout. Что, если код вашей библиотеки вызывается чьим-то набором модульных тестов? Или на веб-сервере, который использует другую парадигму ведения журнала?

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

  1. Создать простой IMyLibraryLogger интерфейс, поставляемый с вашей библиотекой. Если вызывающий код хочет прослушивать сообщения отладки, он может реализовать адаптер, который соединяет ваш интерфейс с выбранной системой ведения журнала.
  2. В зависимости от того, на какие платформы нацелена ваша библиотека, используйте Microsoft.Extensions. Logging.Abstractions как общий интерфейс логгера. Для этого требуется, чтобы ваша библиотека была целевой. NET Standard 2.0.

Я сделал №1 в библиотеках, которые я создал в прошлом, и он работал хорошо. Не имело значения, использовали ли системы моего клиента log 4net, Serilog и т.д. c. Моя библиотека заботилась только о небольшом интерфейсе журналирования, который она опубликовала, и отправляла ему сообщения безопасным способом (без операции, если он был нулевым / не предоставлен).

...