Второй дубль:
Хороший подход - AOP с Postsharp.
Я использовал во многих проектах.
Вы можете определить атрибут, который наследуется от базового API PostSharp, который позволяет вам перехватывать любой вызов метода, в который вы помещаете свой пользовательский атрибут.
Если вы поместите этот атрибут в любой метод, вы сможете попробовать / перехватить абсолютно любое тело метода и, в конце концов, контролировать исключения и регистрировать их.
Вы можете достичь той же цели с помощью Castle Dynamic Proxy, но это решение во время выполнения, поскольку вы можете создавать прокси-классы с перехватчиками и создавать экземпляры ваших классов с помощью фабрики. Очевидно, что это потребляет больше ресурсов.
Postsharp выполняет IL-ткачество, что означает, что ваши перехватчики будут внедрены в ваш реальный код во время компиляции, поэтому вы не потеряете производительность во время выполнения.
Подводя итог, вы можете создать «LogAttribute» и поместить его в любой метод, который хотите регистрировать или делать, если происходит исключение.