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