мы используем что-то подобное в небольшом приложении ASP.NET, которое у нас есть:
protected void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
try
{
var userName = "<USERNAME not available...>";
if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity != null)
{
userName = HttpContext.Current.User.Identity.Name;
}
Exception exc = Server.GetLastError();
var logger = new IEMLogger();
logger.Error(string.Format("Application_Error - user: {0}", userName), exc);
// Clear the error from the server
Server.ClearError();
}
catch (Exception /*exc*/)
{
// DOES NOTHING:
// no recursive error reports in case the logging fails...
}
}
это использует очень оборонительный подход, проверяющий также нулевой контекст, текущий нулевой пользователь и так далее.IEMLogger является нашей оболочкой для LogçNet, поэтому у нас нет зависимостей от LogçNet, разбросанных по всему ...
Редактировать: обратите внимание, что этот обработчик событий Application_Error в Global.asax является последним средствомобработчик исключений, который вы должны иметь, он перехватывает все необработанные исключения, но NOT заменяет блоки try / catch, которые вы в любом случае должны иметь в своих классах приложения.Пусть те попробуют перехватить, как необходимо, в коде вашего приложения и использовать тот же подход с классом logger, который регистрирует исключения в тех самых местах, где создаются исключения ... это зависит от вашего общего подхода к обработке исключений и ошибок, тогда, есливы идете для Log4Net, NLog или других регистраторов все на самом деле деталь ...