Нужно ли логировать собственные библиотеки

Предположим, я разрабатываю библиотеку или просто некоторый модуль для своей программы, нужно ли мне ее/его логгировать?

Склоняюсь к тому, что нужно только выбрасывать исключения или коды ошибок, по причинам:

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

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

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

Не подскажете, как мне действовать?


Ответы (1 шт):

Автор решения: Alex F

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

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

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

И наконец, где держать логи. Библиотека может сама их создавать. Например, под Windows где-нибудь в директории Users. Обычно это делается в библиотеках для работы с устройствами.

Другой способ - передавать каждое сообщение для лога клиенту через какой-нибудь callback. Например, через виртуальную функцию. Программа клиента сама решает, что с этим делать. Может записать в файл. Может напечатать в консоли. Этот способ более универсальный.

→ Ссылка