Нужно ли логировать собственные библиотеки
Предположим, я разрабатываю библиотеку или просто некоторый модуль для своей программы, нужно ли мне ее/его логгировать?
Склоняюсь к тому, что нужно только выбрасывать исключения или коды ошибок, по причинам:
- Если я буду логировать методы своего класса, то, при выбросе исключения в методе, он будет прологирован как в методе класса, так и в модуле, который его вызвал, то есть будет двойное логирование, а если таких уровней будет больше чем два?
- Чужие библиотеки в продакшене не логируются
С другой стороны, логирование своих библиотек позволит мне иметь полный контроль над всем ходом выполнения программы
Прихожу к выводу, что нужно логировать свои библиотеки только на этапе тестирования. Но тогда мне придется на самом верхнем уровне помещать в try вызов каждой функции/метода, которое может выкинуть исключение, чтобы иметь полноту информации, что не очень удобно
Не подскажете, как мне действовать?
Ответы (1 шт):
Исключения и логи и имеют ряд отличий. Логи испольуются не только в случае ошибки. Исключения это часть public interface. Логи могут работать опционально, исключения должны работать всегда. Логи пишутся и читаются разработчиком, они могут содержать внутреннюю информацию. Клиент должен знать, где находятся логи, и отправлять их разработчику, если есть какие-то проблемы.
Должны ли содержать логи информацию об исключениях - это решение разработчика. Лучше это делать, потому что ленивый клиент не всегда правильно обрабатывает исключения.
Если библиотека имеет свои собственные потоки, то единственный способ получить детальную информацию - это лог. Поток не выполняется в контексте пользовательской функции.
И наконец, где держать логи. Библиотека может сама их создавать. Например, под Windows где-нибудь в директории Users
. Обычно это делается в библиотеках для работы с устройствами.
Другой способ - передавать каждое сообщение для лога клиенту через какой-нибудь callback. Например, через виртуальную функцию. Программа клиента сама решает, что с этим делать. Может записать в файл. Может напечатать в консоли. Этот способ более универсальный.