Log4Net на MVC.NET с использованием Ninject - PullRequest
4 голосов
/ 04 августа 2011

Я пытаюсь настроить Log4Net в проекте MVC.net с помощью Ninject. Я достиг точки, когда я могу видеть выходные данные отладки Ninject, но я все еще не вижу никаких результатов регистрации.

Это все работает на моем локальном хосте, поэтому проблем с безопасностью быть не должно.

У меня есть следующие настройки:

В AssemblyInfo.cs я добавил это, чтобы указать log4net в Web.config для конфигурации

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]

В Web.config я добавил следующие разделы

    <configSections>
       <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
    </configSections>

...
    <appSettings>
       <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
...
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="log-file.txt" />
      <appendToFile value="true" />
      <encoding value="utf-8" />
      <layout type="log4net.Layout.SimpleLayout" />
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="FileAppender" />
    </root>
  </log4net>

В моем базовом контроллере, от которого наследуются все остальные контроллеры в системе, у меня есть следующее:

[Inject]
public ILogger logger { get; set; }

Затем я добавил явное новое исключение («testException») на страницу входа в систему, чтобы вызвать ошибку, которая, как я ожидал, будет отображаться в файле журнала.

Из трассировки отладки при запуске я вижу следующее.

log4net: log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821]. Loaded from [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\portal\63a118bb\781d84b7\assembly\dl3\40d137a6\9fb44da2_c951cc01\log4net.dll]. (.NET Runtime [4.0.30319.235] on Microsoft Windows NT 6.1.7601 Service Pack 1)
log4net: DefaultRepositorySelector: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository for assembly [Ninject.Extensions.Logging.Log4Net, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7]
log4net: DefaultRepositorySelector: Assembly [Ninject.Extensions.Logging.Log4Net, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7] Loaded From [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\portal\63a118bb\781d84b7\assembly\dl3\edd36351\91af46a2_c951cc01\Ninject.Extensions.Logging.Log4Net.dll]
log4net: DefaultRepositorySelector: Assembly [Ninject.Extensions.Logging.Log4Net, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7] does not have a RepositoryAttribute specified.
log4net: DefaultRepositorySelector: Assembly [Ninject.Extensions.Logging.Log4Net, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]

У меня такое ощущение, что это, вероятно, проблема конфигурации, но любая помощь будет признательна.

1 Ответ

0 голосов
/ 14 августа 2011

Внедрение экземпляра ILog или ILogger не регистрирует неявно какой-либо обработчик исключений. Это просто дает вам доступ к логгеру. Вы все еще должны сказать ему, что регистрировать и когда регистрировать это.

Если вы хотите протестировать свою конфигурацию, сделайте запись в журнале одного из действий вашего контроллера или используйте один из инициаторов события OnAction. Это, вероятно, должно делать то, что вы хотите:

public class MyController : Controller
{
    protected override void OnActionExecuted(ActionExecutedContext context)
    {
        if (Logger != null)
        {
            string message = string.Format("Action executed: {0}.{1}",
                context.ActionDescriptor.ControllerDescriptor.ControllerName,
                context.ActionDescriptor.ActionName);
            Logger.Log(typeof(MyController), log4Net.Core.Level.Trace,
                message, context.Exception);
        }
        base.OnActionExecuted(context);
    }

    [Inject]
    public ILogger Logger { get; set; }
}

Это будет регистрировать каждое действие контроллера - включая исключения. Если вас интересуют только исключения, тогда либо проверьте свойства context.Exception и context.ExceptionHandled перед регистрацией, либо, что еще лучше, напишите собственный ActionFilter для этого.

...