2009-02-20 22 views
97

में लॉगिंग त्रुटियां मैं वर्तमान में अपवाद लॉग करने के लिए अपने एएसपी.नेट एमवीसी अनुप्रयोग में log4net का उपयोग कर रहा हूं। जिस तरह से मैं यह कर रहा हूं वह है कि मेरे सभी नियंत्रक बेसकंट्रोलर कक्षा से उत्तराधिकारी हों। BaseController के OnActionExecuting घटना में, मैं किसी भी अपवाद है कि हुआ हो सकता है लॉग इन करें:एएसपी.नेट एमवीसी

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    // Log any exceptions 
    ILog log = LogManager.GetLogger(filterContext.Controller.GetType()); 

    if (filterContext.Exception != null) 
    { 
     log.Error("Unhandled exception: " + filterContext.Exception.Message + 
      ". Stack trace: " + filterContext.Exception.StackTrace, 
      filterContext.Exception); 
    } 
} 

यह अच्छा काम करता है अगर एक नियंत्रक कार्रवाई के दौरान एक बिना क्रिया का अपवाद हो गई।

<customErrors mode="On"> 
    <error statusCode="404" redirect="~/page-not-found"/> 
</customErrors> 

और नियंत्रक कार्रवाई है कि "पेज-नहीं-नहीं मिला" यूआरएल संभालती में, मैं लॉग इन करें:

404 त्रुटियों का सवाल है, मैं एक कस्टम त्रुटि इसलिए की तरह मेरे web.config में सेट अप करना मूल यूआरएल अनुरोध किया जा रहा है:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult PageNotFound() 
{ 
    log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"])); 

    return View(); 
} 

और यह भी काम करता है।

समस्या जो मैं कर रहा हूं वह यह है कि .aspx पृष्ठों पर मौजूद त्रुटियों को कैसे लॉग करना है। मान लीजिए कि मैं पृष्ठों या कुछ इनलाइन कोड है कि एक अपवाद फेंक होगा में से एक पर एक संकलन त्रुटि करते हैं:

<% ThisIsNotAValidFunction(); %> 
<% throw new Exception("help!"); %> 

ऐसा लगता है कि HandleError विशेषता सही ढंग से साझा फ़ोल्डर में मेरी Error.aspx पेज को यह पुनः मार्ग निर्माण किया जाता है, लेकिन यह निश्चित रूप से मेरे बेसकंट्रोलर के ऑनएक्शन एक्स्क्टेड विधि द्वारा पकड़ा नहीं जा रहा है। मैं सोच रहा था कि मैं शायद लॉगिंग कोड को Error.aspx पेज पर ही डाल सकता हूं, लेकिन मुझे इस स्तर पर त्रुटि जानकारी को पुनर्प्राप्त करने के बारे में अनिश्चितता है।

+0

ELMAH के लिए +1। यहां एक [ELMAH ट्यूटोरियल] है (http://blog.elmah.io/elmah-tutorial/) मैंने आपको प्रारंभ करने में मदद के लिए लिखा था। कस्टम त्रुटि पृष्ठों आदि के साथ समस्याओं से बचने के लिए ASP.NET MVC का उपयोग करते समय [Elmah.MVC] (https://www.nuget.org/packages/Elmah.MVC/) पैकेज का उपयोग करना भी याद रखें – ThomasArdal

+0

कुछ उत्पाद हैं वहां मौजूद है जो .NET ऐप्स में होने वाली सभी त्रुटियों को लॉग करेगा। वे ELMAH या log4net के रूप में निम्न स्तर के रूप में नहीं हैं, लेकिन यदि आप केवल त्रुटियों की निगरानी और निदान करने का प्रयास कर रहे हैं तो आपको एक टन बचाएं: [Bugsnag] (https://docs.bugsnag.com/platforms/dotnet/ एएसपी-नेट /) और [एयरब्रैक] (https://airbrake.io/languages/net_bug_tracker) उनमें से दो हैं जो मुझे पता है .NET –

उत्तर

96

मैं Elmah में प्लग करके अपने वेब एप्लिकेशन को सरल बनाने पर विचार करता हूं।

आप अपनी परियोजना में एल्मा असेंबली जोड़ते हैं और फिर अपने web.config को कॉन्फ़िगर करते हैं। इसके बाद यह नियंत्रक या पृष्ठ स्तर पर बनाए गए अपवाद लॉग करेगा। इसे विभिन्न विभिन्न स्थानों (जैसे SQL सर्वर, ईमेल इत्यादि) पर लॉग इन करने के लिए कॉन्फ़िगर किया जा सकता है। यह एक वेब फ्रंटएंड भी प्रदान करता है, ताकि आप अपवादों के लॉग के माध्यम से ब्राउज़ कर सकें।

यह पहली चीज है जिसे मैं किसी भी एएसपीएनटी एमवीसी ऐप में जोड़ता हूं।

मैं अभी भी लॉग 4नेट का उपयोग करता हूं, लेकिन मैं डीबग/जानकारी लॉगिंग के लिए इसका उपयोग करता हूं, और सभी अपवादों को एल्मा को छोड़ देता हूं।

आप How do you log errors (Exceptions) in your ASP.NET apps? पर भी अधिक जानकारी प्राप्त कर सकते हैं।

+3

मैंने हाल ही में एल्मा का उपयोग शुरू किया और यह मेरे सबसे धीमे और सरल अपवाद लॉगर्स में से एक है कभी इस्तेमाल किया मैंने एक पोस्ट पढ़ी है जिसमें एमएस को एएसपीनेट में शामिल करना चाहिए और मैं सहमत हूं। – dtc

+13

ऐप के लिए मुझे ELMAH और log4net दोनों की आवश्यकता क्यों है। प्रवेश? एक समाधान क्यों नहीं? – VJAI

+0

क्या यह काम करेगा भले ही मेरे पास एन-स्तरीय आर्किटेक्चर हो? नियंत्रक - सेवाएं - भंडार? –

1

आप HttpContext.Error की जांच करने का प्रयास कर सकते हैं, लेकिन मुझे इस पर यकीन नहीं है।

2

क्या आपने हैंडलरर विशेषता को विस्तारित करने के बारे में सोचा है? इसके अलावा, स्कॉट के नियंत्रकों/कार्यों here पर फिल्टर इंटरसेप्टर के बारे में एक अच्छा ब्लॉग पोस्ट है।

1

Error.aspx दृश्य इस तरह परिभाषित किया गया है:

namespace MvcApplication1.Views.Shared 
{ 
    public partial class Error : ViewPage<HandleErrorInfo> 
    { 
    } 
} 

HandleErrorInfo तीन गुण है: स्ट्रिंग ActionName स्ट्रिंग ControllerName अपवाद अपवाद

आप HandleErrorInfo उपयोग करने में सक्षम होना चाहिए और इसलिए दृश्य के भीतर अपवाद।

35

आप ग्लोबल.एक्सएक्स में ऑनरर इवेंट में हुक कर सकते हैं।

कुछ इस तरह:

/// <summary> 
/// Handles the Error event of the Application control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> 
protected void Application_Error(object sender, EventArgs e) 
{ 
    if (Server != null) 
    { 
     Exception ex = Server.GetLastError(); 

     if (Response.StatusCode != 404) 
     { 
      Logging.Error("Caught in Global.asax", ex); 
     } 

    } 


} 
+2

यह सभी अपवादों को पकड़ना चाहिए। मैं इसे सबसे अच्छा अभ्यास मानता हूं। –

+4

रीशेर्पर के मूल्य विश्लेषण के अनुसार, 'सर्वर' हमेशा गैर-शून्य होगा। –

+6

404 को अनदेखा करने के लिए आपने जिस तरीके से लिखा था, उसके लिए काम नहीं किया। मैंने लिखा 'अगर (पूर्व एचटीपीएक्सप्शन एंड ((एचटीपीएक्सप्शन) पूर्व है) .GetHttpCode() == 404) वापसी; ' – pauloya

19

MVC3
गुण है कि HandleErrorInfoAttribute से विरासत और Global.asax RegisterGlobalFilters में प्रवेश की अपनी पसंद

public class ErrorLoggerAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     LogError(filterContext); 
     base.OnException(filterContext); 
    } 

    public void LogError(ExceptionContext filterContext) 
    { 
     // You could use any logging approach here 

     StringBuilder builder = new StringBuilder(); 
     builder 
      .AppendLine("----------") 
      .AppendLine(DateTime.Now.ToString()) 
      .AppendFormat("Source:\t{0}", filterContext.Exception.Source) 
      .AppendLine() 
      .AppendFormat("Target:\t{0}", filterContext.Exception.TargetSite) 
      .AppendLine() 
      .AppendFormat("Type:\t{0}", filterContext.Exception.GetType().Name) 
      .AppendLine() 
      .AppendFormat("Message:\t{0}", filterContext.Exception.Message) 
      .AppendLine() 
      .AppendFormat("Stack:\t{0}", filterContext.Exception.StackTrace) 
      .AppendLine(); 

     string filePath = filterContext.HttpContext.Server.MapPath("~/App_Data/Error.log"); 

     using(StreamWriter writer = File.AppendText(filePath)) 
     { 
      writer.Write(builder.ToString()); 
      writer.Flush(); 
     } 
    } 

प्लेस विशेषता शामिल बनाएं

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     // filters.Add(new HandleErrorAttribute()); 
     filters.Add(new ErrorLoggerAttribute()); 
    } 
संबंधित मुद्दे