1) А что мешает сразу на месте залоггировать ошибку без выброса эксепшена? Так ли он нужен там?
3) Не логгируй из конструктора исключения. Не все смогут догадаться найти вызов логгера там.
2) Для сообщений есть хорошая такая штука - Resource Bundle. Позволяют заодно и интернациализацию сделать не так сложно как могло бы быть.
Чем не устраивает стандартный try/catch?
Если уж сильно хочется все повыносить - сделай банальный ExceptionHandler и скидывайв него пойманные и созданные исключения.