Лучший способ для регистрации исключений в Spring.NET с Log4net или Nlog - PullRequest
1 голос
/ 20 ноября 2011

Я хотел бы знать, какой способ исключения журнала в Spring.NET предпочтителен и почему. Я нашел два распространенных сценария.

1. Используйте IThrowAdvice.

Я создал команду throws и в методе AfterThrowing handle / log исключение.

namespace Aspects
{
    public class ExLogThrowsAdvice : IThrowsAdvice
    {
        private ILog _logger;

        public ExLogThrowsAdvice()
        {
            _logger = LogManager.GetLogger("Error_file");
        }

        public void AfterThrowing(MethodInfo methodInfo,
            Object []args, Object target, Exception exception)
        {
            _logger.Error(exception);
        }
    }
}

и используйте Common.Loggin API ( Common Loggin API ) для настройки, например, Log4net для ведения журнала.

<sectionGroup name="common">
    <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
</sectionGroup>

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<log4net>
    <appender name="ErrorFileAppender"
              type="log4net.Appender.FileAppender">
        <file value="errors.txt"/>
        <filter type="log4net.Filter.LevelRangeFilter">
          <levelMin value="ERROR" />
          <levelMax value="FATAL" />
        </filter>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date%newline%username%newline[%thread] %message %newline"/>
        </layout>
    </appender>

    <root>
      <level value="ERROR"/>
      <appender-ref ref="ErrorFileAppender"/>
    </root>
</log4net>

И, наконец, создайте прокси для объекта в бизнес-слое.

  <!--ex log advice-->
  <object id="theExLogAdvice" type="Aspects.ExLogThrowsAdvice, ExceptionLogging"/>

  <!--auto proxy creator-->
  <object type="Spring.Aop.Framework.AutoProxy.TypeNameAutoProxyCreator, Spring.Aop">
      <property name="TypeNames" value="Aspects*"/>
      <property name="InterceptorNames">
          <list>
              <value>theExLogAdvice</value>
          </list>
      </property>
  </object>

Это первая концепция. Второе, что я обнаружил, - это использование аспектных обработчиков исключений из библиотеки Spring Aspect.

2.Особенности исключений из Spring.NET

Я хотел бы создать обработчик для исключения журнала, и этот обработчик будет использовать регистратор Log4net.

Обработчик для исключения:

<object id="exLogHandler"
        type="Spring.Aspects.Exceptions.LogExceptionHandler, Spring.Aop">
    <property name="LogName" value="???"/>
    <property name="LogLevel" value="Error"/>
</object>

и затем используйте этот обработчик в совете по обработке исключений:

<object id="exLogAspect"
      type="Spring.Aspects.Exceptions.ExceptionHandlerAdvice, Spring.Aop">
    <property name="ExceptionHandlerDictionary">
        <dictionary>
            <entry key="log" ref="exLogHandler"/>
        </dictionary>
    </property>

    <property name="ExceptionHandlers">
        <list>
            <value>on exception name SomeException log 'Ex:' + #e</value>
        </list>
    </property>

Я не уверен, что второй способ хорош. Может быть, это глупость.

Можно ли настроить LogExceptionHandler для использования регистратора Log4net?

1 Ответ

1 голос
/ 21 ноября 2011

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

<object name="loggingAdvice" type="Spring.Aspects.Logging.SimpleLoggingAdvice, Spring.Aop">
  <property name="LogUniqueIdentifier" value="true"/>               
  <property name="LogExecutionTime"    value="true"/>               
  <property name="LogMethodArguments"  value="true"/>
  <property name="LogReturnValue"      value="true"/>

  <property name="Separator"           value=";"/>
  <property name="LogLevel"            value="Info"/>


  <property name="HideProxyTypeNames"  value="true"/>
  <property name="UseDynamicLogger"    value="true"/>
</object>

Конечно, вам все еще нужно настроить фабрику прокси и logging , но вы уже знаете, как это сделать.

...