asp.net-mvc - एएसपी.नेट एमवीसी में लॉगिंग त्रुटियां




3 Answers

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

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

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

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

आप प्रश्न में अधिक जानकारी भी प्राप्त कर सकते हैं आप अपने एएसपी.NET ऐप्स में त्रुटियों (अपवाद) कैसे लॉग करते हैं?

मैं वर्तमान में अपवाद लॉग करने के लिए अपने एएसपी.नेट एमवीसी अनुप्रयोग में 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);
    }
}

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

404 त्रुटियों के लिए, मेरे पास मेरे web.config में एक कस्टम त्रुटि स्थापित है जैसे:

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

और नियंत्रक कार्रवाई में जो "पृष्ठ-नहीं मिला" यूआरएल को संभालता है, मैं अनुरोध किए जाने वाले मूल यूआरएल को लॉग करता हूं:

[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!"); %>

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




MVC3
HandleErrorInfoAttribute से विरासत में प्राप्त विशेषता बनाएं और लॉगिंग की अपनी पसंद शामिल करें

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

Global.asax RegisterGlobalFilters में विशेषताएँ रखें

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
       // filters.Add(new HandleErrorAttribute());
        filters.Add(new ErrorLoggerAttribute());
    }



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

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

HandleErrorInfo में तीन गुण हैं: स्ट्रिंग एक्शननाम स्ट्रिंग कंट्रोलरनाम अपवाद अपवाद

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




Related