2014-09-16 8 views
40

में वैश्विक अपवाद हैंडलिंग वेब एपीआई 2.1 में नया Global Error Handling है। मुझे कुछ उदाहरण मिला कि एल्मा (elmah sample) में अपवाद लॉग कैसे करें। लेकिन मैं डेटाबेस तालिका में त्रुटियों को लॉग करने के लिए एनएलओजी का उपयोग करता हूं। क्या एनएलओजी के साथ वेब एपीआई ग्लोबल एरर हैंडलिंग का उपयोग करना उचित है? कृपया कुछ उदाहरण प्रदान करें।वेब एपीआई 2.1 और एनएलओजी

उत्तर

46

यह वास्तव में काफी सरल है, आप या तो IExceptionLogger को हाथ से या बेस क्लास, ExceptionLogger से प्राप्त करते हैं।

public class NLogExceptionLogger : ExceptionLogger 
{ 
    private static readonly Logger Nlog = LogManager.GetCurrentClassLogger(); 
    public override void Log(ExceptionLoggerContext context) 
    { 
     Nlog.LogException(LogLevel.Error, RequestToString(context.Request), context.Exception); 
    } 

    private static string RequestToString(HttpRequestMessage request) 
    { 
     var message = new StringBuilder(); 
     if (request.Method != null) 
      message.Append(request.Method); 

     if (request.RequestUri != null) 
      message.Append(" ").Append(request.RequestUri); 

     return message.ToString(); 
    } 
} 

इसके अलावा config में जोड़ें:

var config = new HttpConfiguration(); 

config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger()); 

पूर्ण नमूना समाधान here पा सकते हैं।

+0

किसी भी तरह से ExceptionLoggerContext (शायद .xceptionContext.ControllerContext.GetType()) का उपयोग करना संभव होगा नियंत्रक-विशिष्ट लॉगर प्राप्त करें? यह हमें (Nlog.config के माध्यम से) प्रति नियंत्रक अपवाद लॉगिंग चालू/बंद करने में सक्षम करेगा। उपरोक्त लॉगर GetCurrentClassLogger का उपयोग करके तत्काल है जिसका अर्थ है कि लॉग इवेंट प्रति नियंत्रक के बीच अंतर करना संभव नहीं होगा ठीक है? –

+0

हालांकि यह अपवाद लॉगिंग है, इसे लॉग इन करने के बजाय अपवाद हैंडलिंग के लिए और भी कुछ है। उदाहरण के लिए आप क्लाइंट को उचित संदेश के साथ एक समान संदेश वापस लौटना चाहते हैं। क्या यह पैटर्न इस कवर द्वारा कवर किया गया है? –

+0

@SonicSoul यह आवश्यकता लॉगर कार्य से कोई लेना देना नहीं है। बस लागू करें IHttpActionResult इंटरफ़ेस का उल्लेख करें और एक अच्छा स्ट्रिंग सामग्री संदेश लौटाएं। – Pascal

4

अन्य चीज जो आसान हो सकती है WebApiContrib.Tracing.NLog पैकेज जो आपको आईएलआरईआरआरआईटर इंटरफ़ेस का उपयोग एनएलओजी के साथ लॉग करने के लिए आउटपुट करने की अनुमति देता है। ITraceWriter के बारे में एक अच्छी बात यह है कि "सभी निशान एक ही अनुरोध से संबंधित हो सकते हैं जिससे कोड चलाना पड़ता है (this link देखें)

संबंधित मुद्दे