2013-04-14 13 views

risposta

4

Se si dispone di una soluzione di registrazione esistente, è possibile utilizzare il progetto ServiceStack.Logging.Elmah. È disponibile tramite NuGet.

Eccezioni, errori e chiamate fatali verranno registrati su Elmah oltre al registratore originariamente previsto. Per tutti gli altri tipi di registro, viene utilizzato solo il registratore originale.

Quindi, se si sta già utilizzando Log4Net allora si può solo configurare Elmah come questo

ElmahLogFactory factory = new ElmahLogFactory(new Log4NetFactory()); 

Se non si vuole avvolgere in più di un registro esistente allora si può solo aggiungere la ricerca Elmah a qualsiasi ASP. Sito Web NET. Non c'è motivo per cui non funzionerebbe solo perché stai usando ServiceStack.

3
using ServiceStack.Logging; 
using ServiceStack.Logging.Elmah; 
using ServiceStack.Logging.NLogger; 

public AppHost() 
     : base(
      "description", 
      typeof(MyService).Assembly) 
    { 
     LogManager.LogFactory = new ElmahLogFactory(new NLogFactory()); 
    } 

    public override void Configure(Container container) 
    { 
     this.ServiceExceptionHandler += (request, exception) => 
      { 
       // log your exceptions here 
       HttpContext context = HttpContext.Current; 
       ErrorLog.GetDefault(context).Log(new Error(exception, context)); 

       // call default exception handler or prepare your own custom response 
       return DtoUtils.HandleException(this, request, exception); 
      }; 

     // rest of your config 
    } 
} 

Ora gli errori di ServiceStack appaiono in Elmah (supponendo che tu abbia configurato web.config ecc.).

+0

Giusto per essere chiari, la risposta di cui sopra sta utilizzando un unico punto di ingresso per le eccezioni ... https: // GitHub .com/ServiceStack/ServiceStack/wiki/gestione degli errori – Darren

2

In realtà la risposta di kampsj è migliore di quella di Gavin dato che Gavins causa la doppia registrazione su elmah chiamando il registro elmah esplicito e quindi la gestione degli errori del server di default ... che già esegue la registrazione.

Quindi, in realtà tutto ciò che serve è questo (sotto supponendo che si desidera involucro NLog con Elmah)

public class YourAppHost : AppHostBase 
{ 
    public YourAppHost() //Tell ServiceStack the name and where to find your web services 
     : base("YourAppName", typeof(YourService).Assembly) 
    { 
     LogManager.LogFactory = new ElmahLogFactory(new NLogFactory()); 
    } 

    //...just normal stuff... 
} 

Si potrebbe semplicemente avere questo sopra:

ElmahLogFactory factory = new ElmahLogFactory(); 

... ma tu probabilmente dovrebbe includere un altro tipo di registratore per la registrazione non di errore, come Debug e Warn.

0

Questa sezione su configuring Elmah e Logging.Elmah UseCase per un esempio funzionante di ServiceStack ed Elmah configurati insieme.

Il ElmahLogFactory può essere configurato in Global.asax prima di inizializzare il ServiceStack AppHost, ad esempio:

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     var debugMessagesLog = new ConsoleLogFactory(); 
     LogManager.LogFactory = new ElmahLogFactory(debugMessagesLog, this); 
     new AppHost().Init(); 
    } 
}