এএসপি.নেট এমভিসিতে লগিং ত্রুটি


109

ব্যতিক্রমগুলি লগ করতে আমি বর্তমানে আমার এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটিতে লগ 4 নেট ব্যবহার করছি। আমি যেভাবে এটি করছি তা হল আমার সমস্ত কন্ট্রোলারগণ বেসকন্ট্রোলার শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত। বেসকন্ট্রোলারের অন্যাকশন এক্সকিউটিং ইভেন্টে, আমি ঘটেছে এমন কোনও ব্যতিক্রম লগ করছি:

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 ত্রুটি হিসাবে, আমার ওয়েলকনফাইগে এর মতো কাস্টম ত্রুটি সেট আপ হয়েছে:

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

দেখা যাচ্ছে যে হ্যান্ডলিরর অ্যাট্রিবিউটটি ভাগ করে নেওয়া ফোল্ডারে আমার ত্রুটি.এএসপিএক্স পৃষ্ঠাতে সঠিকভাবে এটি পুনরায় পাঠাচ্ছে, তবে এটি অবশ্যই আমার বেসকন্ট্রোলারের অন্যাকশনএক্সেকিউড পদ্ধতিতে ধরা পড়েনি। আমি ভাবছিলাম আমি সম্ভবত ত্রুটি.এএসপিএক্স পৃষ্ঠায় লগিং কোডটি রাখতে পারি তবে আমি কীভাবে সেই স্তরে ত্রুটি সম্পর্কিত তথ্য পুনরুদ্ধার করব তা সম্পর্কে আমি নিশ্চিত নই।


ELMAH এর জন্য +1। আপনাকে শুরু করতে সহায়তা করার জন্য আমি এখানে একটি এলএএমএইচ টিউটোরিয়াল লিখেছি। এএসপি.নেট এমভিসি ব্যবহার করার সময় কাস্টম ত্রুটিযুক্ত পৃষ্ঠাগুলি ইত্যাদির সমস্যা এড়াতে এলমাহ.এমভিসি প্যাকেজটি ব্যবহার করার কথাও মনে রাখবেন
থমাসআর্ডাল

সেখানে কয়েকটি পণ্য রয়েছে যা। নেট অ্যাপ্লিকেশনগুলিতে ঘটে যাওয়া সমস্ত ত্রুটি লগ করবে। এগুলি ELMAH বা লগ 4 নেট এর মতো নিচু স্তরের নয়, তবে আপনি যদি ত্রুটিগুলি নিরীক্ষণ ও নির্ণয়ের চেষ্টা করতে চান তবে আপনাকে অনেক সময় বাঁচাতে হবে: বুগনাগ এবং এয়ারব্রেক আমি জানি যে এর মধ্যে দুটি are নেট
ডন পি

উত্তর:


103

আমি এলমে প্লাগ ইন করে আপনার ওয়েব অ্যাপ্লিকেশনটিকে সহজ করার বিষয়ে বিবেচনা করব

আপনি আপনার প্রকল্পে এলমাহ অ্যাসেমব্লিকে যুক্ত করুন এবং তারপরে আপনার ওয়েবকনফিগটি কনফিগার করুন। এটি নিয়ামক বা পৃষ্ঠা স্তরে তৈরি ব্যতিক্রমগুলি লগ করবে। এটি বিভিন্ন বিভিন্ন জায়গায় (যেমন এসকিউএল সার্ভার, ইমেল ইত্যাদি) লগ ইন করতে কনফিগার করা যেতে পারে। এটি একটি ওয়েব ফ্রন্টএন্ডও সরবরাহ করে, যাতে আপনি ব্যতিক্রমগুলির লগের মাধ্যমে ব্রাউজ করতে পারেন।

আমি তৈরি করা কোনও এসপ নেটওয়্যার এমভিসি অ্যাপে এটিই প্রথম জিনিস।

আমি এখনও লগ 4 নেট ব্যবহার করি তবে আমি এটি লগিং ডিবাগ / তথ্য ব্যবহারের জন্য ব্যবহার করি এবং সমস্ত ব্যতিক্রম এলামার কাছে রেখে যাই।

আপনি এএসপি.এনইটি অ্যাপ্লিকেশনগুলিতে ত্রুটিগুলি (ব্যতিক্রমগুলি) কীভাবে লগ করবেন সেই প্রশ্নে আপনি আরও তথ্য সন্ধান করতে পারেন ?


3
আমি সম্প্রতি এলমাহ ব্যবহার করতে শুরু করেছি এবং এটি আমি এর মধ্যে সবচেয়ে চালক এবং সহজ ব্যতিক্রম লগারের মধ্যে ব্যবহার করেছি। আমি একটি পোস্ট পড়েছিলাম যা এমএসের এএসপিএনটিতে অন্তর্ভুক্ত করা উচিত এবং আমি সম্মত।
dtc

14
অ্যাপটির জন্য কেন আমার ELMAH এবং লগ 4 নেট উভয়ের প্রয়োজন। লগিং? একক সমাধান কেন হয় না?
ভিজেআইএআই

আমার কাছে এন-টিয়ার আর্কিটেকচার থাকলেও কি এটি কাজ করবে? নিয়ন্ত্রক - পরিষেবা - ভান্ডার?
a.farkas2508

2
ELMAH অতিরিক্ত রেটযুক্ত।
রনি ওভারবি

ELMAH কি নিখরচায়?
ডালাস

38

আপনি গ্লোবাল.এক্সএক্স-এ অনআরর ইভেন্টে প্রবেশ করতে পারেন।

এটার মতো কিছু:

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

    }


}

3
এটি সমস্ত ব্যতিক্রম ধরা উচিত। আমি এটিকে সেরা অনুশীলন হিসাবে বিবেচনা করি।
আন্দ্রে রেনিয়া

4
রিশার্পারের মান বিশ্লেষণ অনুসারে Serverসর্বদা শূন্য থাকবেন।
ড্রয় নোকস

6
404 উপেক্ষা করে আপনি যেভাবে লিখেছেন তা আমার পক্ষে কাজ করে না। আমি লিখেছিif (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) return;
পাউলোয়া

21

এমভিসি 3 হ্যান্ডেলএররআইরফিনো
অ্যাট্রিবিউট থেকে উত্তরাধিকারসূত্রে অ্যাট্রিবিউট তৈরি করুন এবং আপনার লগিংয়ের পছন্দকে অন্তর্ভুক্ত করুন

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

1

আপনি হ্যান্ডলিরর অ্যাট্রিবিউট বাড়ানোর কথা ভেবেছেন? এছাড়াও, স্কট এখানে নিয়ন্ত্রক / ক্রিয়াকলাপে ফিল্টার ইন্টারসেপ্টর সম্পর্কে একটি ভাল ব্লগ পোস্ট আছে


1

ত্রুটি.এএসপিএক্স ভিউটি এভাবে সংজ্ঞায়িত করা হয়:

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

হ্যান্ডলিররআইরফোতে তিনটি বৈশিষ্ট্য রয়েছে: স্ট্রিং অ্যাকশননাম স্ট্রিং কন্ট্রোলারনাম ব্যতিক্রম ব্যতিক্রম

আপনি হ্যান্ডেলএররআইরফোন অ্যাক্সেস করতে সক্ষম হবেন এবং তাই ভিউয়ের মধ্যে ব্যতিক্রম।


0

আপনি এইচটিটিপি কনটেক্সট পরীক্ষা করার চেষ্টা করতে পারেন rআরর, তবে আমি এটি সম্পর্কে নিশ্চিত নই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.