2016-07-29 3 views
-1

Я новичок в мире Elmah, и я пытаюсь просмотреть его журнал (в проекте web.api), но он не работает. Я думаю, что не хватает какой-то конфигурации :(
Вот конфигурация у меня есть:Elmah с log4net не регистрируется

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

Web.config

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    <sectionGroup name="elmah"> 
    <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" /> 
    <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
    <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" /> 
    <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" /> 
    </sectionGroup> 
</configSections> 

<system.web>  
    <httpModules> 
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>  
    </httpModules> 
    <httpHandlers> 
    <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
    </httpHandlers> 
</system.web> 

<elmah> 
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~\App_Data\" /> 
    <security allowRemoteAccess="1" /> 
</elmah> 

<log4net> 
    <logger name="PROJECT"> 
    <level value="ALL" /> 
    <appender-ref ref="elmahappender" /> 
    </logger> 
    <!--ELMAH Appender--> 
    <appender name="elmahappender" type="elmahappender_log4net.ELMAHAppender, elmahappender_log4net"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [thread] %-5level %logger - %message%newline" /> 
    </layout> 
    <UseNullContext>False</UseNullContext> 
    </appender> 
</log4net> 

<system.webServer> 
    <handlers> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />  
    <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />  
    </handlers> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <remove name="FormsAuthentication" /> 
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> 
    </modules>  
    <validation validateIntegratedModeConfiguration="false" /> 
</system.webServer> 

Может кто-нибудь сказать мне, что я пропускаю

Примечание? : Если я использую другое приложение вроде FileAppender, оно работает!

+0

Ваш первый шаг должен состоять в том, чтобы включить log4net debug logging и искать ошибки. Это [сообщение в блоге от 10 лет назад] (http://haacked.com/archive/2006/09/27/Log4Net_Troubleshooting.aspx/) поможет. – stuartd

+0

Привет, Стюарт, спасибо за ваш ответ, но моя проблема не в этом. Log4net отлично работает, когда я использую FileAppender как appender, но когда я использую ELMAH, он не работает, поэтому я думаю, что мне не хватает какой-либо конфигурации. Если у вас есть какая-то другая идея, это приветствуется. – Lau

+0

Log4net будет использовать правильно настроенные appenders и игнорировать те, которые не являются - но он также выведет детали **, что ** конфигурация недействительна для отладки журнала. – stuartd

ответ

0

Я, наконец, решил свою проблему, прочитав много фологов и сообщений. Я создал ActionFilterAttribute, и после этого все мои исключения записываются в OK в ELMAH. Вот мой код, если кому-то это понадобится.

public class ElmahLogger : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
     { 
     if ((actionExecutedContext.Response != null) && !actionExecutedContext.Response.IsSuccessStatusCode) 
     { 
      try 
      { 
       var messages = (System.Web.Http.HttpError)((System.Net.Http.ObjectContent<System.Web.Http.HttpError>)actionExecutedContext.Response.Content).Value; 
       StringBuilder stringBuilder = new StringBuilder(); 
       foreach (var keyValuePair in messages) 
        stringBuilder.AppendLine(keyValuePair.Value.ToString()); 

       Elmah.ErrorSignal.FromCurrentContext().Raise(new HttpException((int)actionExecutedContext.Response.StatusCode, stringBuilder.ToString())); 
      } 
      catch (Exception ex) 
       Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Error in ElmahLoggerFilter - OnActionExecuted: " + ex.ToString())); 
     } 
    } 
} 

И, конечно же, вам необходимо зарегистрировать свой фильтр в WebApiConfig.cs

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Filters.Add(new ElmahLogger()); 
    } 
} 

Наслаждайтесь! :)

+0

Вы не должны сами писать этот код. Существует проект [contrib] (https://www.nuget.org/packages/Elmah.Contrib.WebApi/) для ELMAH для обработки веб-API. Я написал сообщение (http://docs.elmah.io/logging-to-elmah-io-from-web-api/) о том, как его установить и настроить, используя [elmah.io] (https: // elmah. io /), но процедура аналогична с регистратором XML. Просто не устанавливайте пакет elmah.io, но только elmah.corelibrary и настройте его с помощью однострочного интерфейса :) – ThomasArdal

+0

Спасибо @ThomasArdal за сообщение! – Lau