2016-07-29 1 views
-1

Je suis nouveau dans le monde d'Elmah et j'essaie de voir mon journal (dans un projet web.api) avec ça, mais ça ne marche pas. Je pense que je suis manque une configuration :(
Voici la configuration que j'ai:Elmah avec log4net ne se connecte pas

[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> 

Quelqu'un peut-il me dire ce que je suis absent

Remarque? : Si j'utilise un autre appender comme (FileAppender), cela fonctionne!

Merci!

+0

Votre première étape devrait être d'activer la journalisation de débogage de log4net et de rechercher toute erreur. Ce [article de blog d'il y a 10 ans] (http://haacked.com/archive/2006/09/27/Log4Net_Troubleshooting.aspx/) aidera. – stuartd

+0

Bonjour Stuartd, merci pour votre réponse mais mon problème ce n'est pas ça. Log4net fonctionne correctement lorsque j'utilise FileAppender en tant qu'appendice, mais lorsque j'utilise ELMAH, cela ne fonctionne pas, donc je pense qu'il me manque une configuration. Si vous avez d'autres idées, c'est la bienvenue. – Lau

+0

Log4net utilisera des appenders correctement configurés et ignorera ceux qui ne le sont pas, mais il affichera également les détails de la configuration de ** what ** qui n'est pas valide pour la journalisation du débogage. – stuartd

Répondre

0

J'ai finalement résolu mon problème après avoir lu beaucoup de foros et de messages. J'ai créé un ActionFilterAttribute et après cela, toutes mes exceptions sont enregistrées OK dans ELMAH. Voici mon code au cas où quelqu'un en aurait besoin.

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())); 
     } 
    } 
} 

Et bien sûr, vous devez enregistrer votre filtre WebApiConfig.cs

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

Profitez-en! :)

+0

Vous ne devriez pas écrire ce code vous-même. Il existe un projet [contrib] (https://www.nuget.org/packages/Elmah.Contrib.WebApi/) permettant à ELMAH de gérer l'API Web. J'ai écrit un post (http://docs.elmah.io/logging-to-elmah-io-from-web-api/) sur la façon de l'installer et de le configurer en utilisant [elmah.io] (https: // elmah. io /), mais la procédure est la même avec l'enregistreur XML. Juste ne pas installer le paquet elmah.io mais elmah.corelibrary seulement et le configurer en utilisant un one-liner :) – ThomasArdal

+0

Merci @ThomasArdal pour votre message! – Lau