Ведение журнала относится к сфере «разделения интересов», как в аспектно-ориентированном программировании
Обычно ведение журнала не является функцией или задачей объекта (например, оно не меняет состояние объекта; это всего лишь механизм наблюдения / записи состояния, а вывод по существу одноразовый в большинстве контекстов)
Это эфемерная и часто дополнительная функция, которая не способствует работе класса.
Метод объекта может выполнять запись в журнал, но регистрация может быть выполнена там, потому что это удобное место для этого, или в точке выполнения кода есть место, где нужно записать состояние.
Поскольку C ++ не предоставляет средств для определения аспектов, я склонен просто сохранять по существу внешние эфемерные объекты, такие как логгеры, глобальными и заключать их в пространство имен, чтобы их как-то содержать. Пространства имен не предназначены для ограничения, так что это отчасти уродливо, но из-за отсутствия чего-либо еще это удобно и гораздо менее уродливо и неудобно, чем передача регистраторам формальных параметров или ссылки на них во всех объектах, которые вы хотите зарегистрировать. Это также облегчает удаление регистратора, если в какой-то момент я решаю, что он мне больше не нужен (т. Е. Если он использовался только для отладки).