2009-08-18 2 views
6

Как получить блок приложений обработки исключений (EHAB) для записи значений из свойства Exception.Data в журнале?Exception.Data информация отсутствует в журнале EntLib

try 
    { 
    // ... 
    } 
    catch (Exception ex) 
    { 
    ex.Data.Add("Hello", "World"); 
    throw ex; 
    } 

Исключение регистрируется правильно, но я не могу найти дополнительные данные в любом месте в записи журнала, созданные EHAB.

Насколько я понимаю, рекомендуется использовать дополнительную релевантную информацию самому исключению, как в приведенном выше примере. Вот почему я немного удивлен, что EHAB не включает это по умолчанию.

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

Text Formatter Template Editor http://img195.imageshack.us/img195/6614/capturegmg.png

Или мне действительно нужно реализовать свое собственное пользовательское форматирование для достижения этой цели?

EDIT/UPDATE:

Я делаю это в моем Global.asax.cs для того, чтобы избежать необходимости добавить вызов метода HandleException везде в моем коде:

using EntLib = Microsoft.Practices.EnterpriseLibrary; 
using System; 

namespace MyApp 
{ 
    public class Global : System.Web.HttpApplication 
    { 
    protected void Application_Error(object sender, EventArgs e) 
    { 
     // I have an "All Exceptions" policy in place... 
     EntLib.ExceptionHandling.ExceptionPolicy.HandleException(Server.GetLastError(), "All Exceptions"); 
     // I believe it's the GetLastError that's somehow returning a "lessor" exception 
    } 
    } 
} 

Оказывается это не такой же, как это (что хорошо работает, и, по сути решает мою проблему):

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    ex.Data.Add("Hello", "World"); 
    bool rethrow = ExceptionPolicy.HandleException(ex, "Log Only Policy"); 
    throw ex; 
} 

Просматривая весь код и добавляя try-catch с вызовом HandleException, просто кажется ... ну, глупо. Я думаю, что моя проблема действительно в том, как использовать EHAB правильно, а не конфигурацию.

Любое предложение о том, как я могу правильно регистрировать все исключения на «глобальном уровне» в веб-приложении ASP.NET?

+0

Я согласен с HandleException: в качестве рамки конструкция «if rethrow» на самом деле не предлагает много абстракции; вам все равно нужно перенести свой код с кодом «if rethrow» в каждом блоке catch. –

ответ

7

Вам не нужно создавать собственный форматтер.

Каждый элемент в ID IDictionary объекта Exception добавляется в словарь ExtendedProperties объекта LogEntry и записывается в журнал (если задано форматированием).

Расширенные свойства: {dictionary ({key} - {value})} config snippet должен регистрировать все пары ключ/значение в словаре расширенных свойств. Если вы хотите зарегистрировать только один элемент из коллекции, вы можете использовать «keyvalue». В вашем примере это будет что-то вдоль линий:

Hello Key: {keyvalue(Hello)} 


Я изменил ExceptionHandlingWithLoggingQuickStart добавить Data.Add («Hello», «World»), и я вижу «Расширенные свойства: Привет - Мир» в конце записи журнала событий. Так что это работает.

Если вы не видите, что поведение, вы должны обеспечить:

  • Это ваше исключение с элементами данных, добавленных передается и ExceptionPolicy.HandleException
  • Это политика, указанная в методе HandleException настроена для входа с LoggingExceptionHandler в конфигурации
  • Это форматировщик, который указан в LoggingConfiguration настроена для поддержки ExtendedProperties


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

UPDATE:

Если вы собираетесь обрабатывать Application_Error в global.asax, то вы будете получать в HttpUnhandledException так как страница не обработает ошибку. Вы можете получить интересующее вас исключение, используя свойство InnerException; InnerException будет содержать исходное исключение (если только это исключение InnerException этого исключения :)). В качестве альтернативы вы можете использовать Server.GetLastError().GetBaseException() для получения исключения, которое является основной причиной.

+0

Спасибо! Ваш ответ один из лучших, с которыми я до сих пор работал. Точный и точный. Жаль, что я могу только дать вам +1 и что эта тема не получает большого внимания. Ты заслуживаешь большего. :) Я опробовал QuickStart и даже заменил свою собственную конфигурацию на одну из образца. Тогда я понял, в чем проблема: я обновил вопрос, и надеюсь, вы тоже сможете мне помочь. –

Смежные вопросы