Как настроить блок приложения ведения журнала Microsoft Enterprise Library для обработки любой категории ведения журнала? - PullRequest
4 голосов
/ 20 марта 2011

Я пытаюсь использовать библиотеки общей инфраструктуры для .NET (Common.Logging) с блоком приложения ведения журналов Enterprise Library 4.1.Согласно документам , это поддерживается.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь что-то записать, например (в этом примере я нахожусь в ASP.NETПриложение MVC):

public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";

    ILog log = LogManager.GetCurrentClassLogger();
    log.Info("Hello world!");

    return View();
}

Вместо получения сообщения в журнале я получаю сообщение об ошибке в журнале событий:

Сообщение: явного сопоставления для категорий'TestApp.Controllers.HomeController'.

Что ж, в Common.Logging, похоже, нет никакой опции для установки категории по умолчанию, и я не могу понять, как настроить LoggingConfigurationпринять любую категорию, даже если она не определена.

Вот фрагмент моей конфигурации LoggingConfiguration:

<loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
...
  <categorySources>
    <add switchValue="All" name="General">
      <listeners>
        <add name="Formatted EventLog TraceListener" />
        <add name="Email TraceListener" />
      </listeners>
    </add>
  </categorySources>
  <specialSources>
    <allEvents switchValue="All" name="All Events" />
    <notProcessed switchValue="All" name="Unprocessed Category" />
    <errors switchValue="All" name="Logging Errors &amp; Warnings">
      <listeners>
        <add name="Formatted EventLog TraceListener" />
      </listeners>
    </errors>
  </specialSources>
</loggingConfiguration>

Я пытался установить logWarningsWhenNoCategoriesMatch в false, но это просто заставляет замолчатьпредупреждение - это не заставляет регистрацию работать.

Я также пытался избавиться от специального источника <notProcessed switchValue="All" .../>, но, похоже, это тоже не имеет никакого эффекта.

Кто-нибудь знает, есть ли способ заставить это работать?Спасибо!

Ответы [ 2 ]

5 голосов
/ 10 сентября 2014

Специальный источник «notProcessed» будет соответствовать любым записям, которые не соответствуют источнику категории, так что вы можете использовать это, чтобы поймать их. Больше информации здесь: https://entlib.codeplex.com/discussions/215189

<notProcessed switchValue="All" name="Unprocessed Category"/>
    <listeners>
        <add name="Rolling Flat File Trace Listener Unprocessed"/>
    </listeners>
</notProcessed>
3 голосов
/ 21 марта 2011

Когда вы звоните LogManager.GetCurrentClassLogger() Common.Logging будет использовать тип вашего класса вызовов в качестве категории:

public static ILog GetCurrentClassLogger()
{
    StackFrame frame = new StackFrame(1, false);
    return Adapter.GetLogger(frame.GetMethod().DeclaringType);
}

Если вы хотите использовать этот подход (хотя рекомендуется не использовать этот метод чрезмерно, поскольку он проверяет StackFrame), тогда да, вам нужно будет создать категорию для каждого класса, из которого вы входите. Это воссоздает вид иерархических регистраторов, которые используются в Log4Net. Но этот подход не идеален, так как он не подлежит ремонту.

Вы можете обойти это, используя перегрузку LogManager.GetLogger(string name) вместо GetCurrentClassLogger. Похоже, что переданное имя будет использоваться в качестве категории для входа в Enterprise Library. Таким образом, вы можете определить имя категории как константу и передать ее в метод GetLogger, и все ваше приложение будет использовать одну категорию Enterprise Library.

...