ত্রুটিগুলিকে ম্যানুয়ালি লগ করতে কীভাবে ELMAH ব্যবহার করবেন


259

ELMAH ব্যবহার করে নিম্নলিখিতটি করা কি সম্ভব?

logger.Log(" something");

আমি এরকম কিছু করছি:

try 
{
    // Code that might throw an exception 
}
catch(Exception ex)
{
    // I need to log error here...
}

এই ব্যতিক্রমটি ELMAH দ্বারা স্বয়ংক্রিয়ভাবে লগ হবে না, কারণ এটি পরিচালনা করা হয়েছিল।


1
ভবিষ্যতের রেফারেন্সের জন্য, আমি ঠিক সে সম্পর্কে একটি পোস্ট লিখেছিলাম: প্রোগ্রামিংয়ে ত্রুটিগুলি লগ করে । আমার ELMAH টিউটোরিয়ালেও এই সম্পর্কে কিছু তথ্য রয়েছে।
থমাসআর্ডাল

উত্তর:


412

ELMAH 1.0 থেকে কাজ করে সরাসরি লগ লেখার পদ্ধতি:

try 
{
    some code 
}
catch(Exception ex)
{
    Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(ex));
}

ELMAH 1.2 আরও নমনীয় এপিআই প্রবর্তন করে:

try 
{
    some code 
}
catch(Exception ex)
{
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}

দুটি সমাধানের মধ্যে পার্থক্য রয়েছে:

  • Raiseপদ্ধতি ব্যতিক্রম ELMAH ফিল্টারিং নিয়ম প্রয়োগ করে। Logপদ্ধতি না।
  • Raise সাবস্ক্রিপশন ভিত্তিক এবং বেশ কয়েকটি লগারে একটি ব্যতিক্রম লগ করতে সক্ষম।

1
আপনার পদ্ধতি এবং অন্যদের মধ্যে পার্থক্য কি?
ওমু

3
অ্যাপ্লিকেশনটি কাজ বন্ধ না করেই এলেম এ ত্রুটি লগ করে। এটি আপনাকে সাধারণ ব্যতিক্রমগুলি ধরতে, এগুলিকে সঠিকভাবে পরিচালনা করতে দেয় তবে এখনও তাদের লগ করতে সক্ষম হয়।
পিসিএসগ্র্যান্ডে

7
আমি দেখতে পেলাম যে এলএমএআরআরসিগন্যাল লগিং করছিল না যখন পোষ্ট ব্যাকটিতে এমভিসি 4 এর জন্য অনিরাপদ এইচটিএমএল রয়েছে N এলমাহ.এররলগ.গেটডাফল্ট সেই দৃশ্যে কাজ করেছিলেন
অ্যাডাম

1
অনিরাপদ এইচটিএমএল নিয়ে আমার একই সমস্যা ছিল।
ত্রুটিলগ.গেটডফল্টটি

4
ব্যবহার করার সময় একটি বড় সতর্কতা Elmah.ErrorLog.Log(): লগ কল নিজেই ব্যর্থ হয় এমন ক্ষেত্রে এটি ছুঁড়ে দেয়, সম্ভবত পুরো ওয়েব অ্যাপ্লিকেশনটি নামিয়ে আনবে। Raise()নিঃশব্দে ব্যর্থ হয়। উদাহরণস্বরূপ: সার্ভার-সাইডে যদি কোনও ভুল কনফিগারেশনের সমস্যা থাকে (উদাহরণস্বরূপ, ত্রুটিগুলি ডিস্কে সংরক্ষণ করার জন্য এলমাহ কনফিগার করা হয়েছে তবে লগ ফোল্ডারে সঠিক প্রবেশাধিকার নেই), .Log()পদ্ধতিটি নিক্ষেপ করবে। (যদিও এটি ডিবাগিংয়ের জন্য ভাল, উদাহরণস্বরূপ কেন .Raise()কিছু লগ করেন না ?)
ক্রিশ্চিয়ান ডায়াকোনস্কু

91

আমি এলমাকে আপনার নিজের একটি সাধারণ মোড়কের ক্লাসে জড়ানোর পরামর্শ দিচ্ছি।

using Elmah;

public static class ErrorLog
{
    /// <summary>
    /// Log error to Elmah
    /// </summary>
    public static void LogError(Exception ex, string contextualMessage=null)
    {
        try
        {
            // log error to Elmah
            if (contextualMessage != null) 
            {
                // log exception with contextual information that's visible when 
                // clicking on the error in the Elmah log
                var annotatedException = new Exception(contextualMessage, ex); 
                ErrorSignal.FromCurrentContext().Raise(annotatedException, HttpContext.Current);
            }
            else 
            {
                ErrorSignal.FromCurrentContext().Raise(ex, HttpContext.Current);
            }

            // send errors to ErrorWS (my own legacy service)
            // using (ErrorWSSoapClient client = new ErrorWSSoapClient())
            // {
            //    client.LogErrors(...);
            // }
        }
        catch (Exception)
        {
            // uh oh! just keep going
        }
    }
}

তারপরে আপনার যখন কোনও ত্রুটি লগ করার দরকার হয় কেবল তখনই এটি কল করুন।

try {
   ...
} 
catch (Exception ex) 
{
    // log this and continue
    ErrorLog.LogError(ex, "Error sending email for order " + orderID);
}

এর নিম্নলিখিত সুবিধা রয়েছে:

  • আপনার এলমা কলটির এই সামান্য প্রত্নতাত্ত্বিক বাক্যটি মনে করার দরকার নেই
  • আপনার যদি অনেকগুলি ডিএলএল থাকে তবে আপনার প্রত্যেককেই থেকে এলমা কোর উল্লেখ করার দরকার নেই - এবং এটি কেবল আপনার নিজের 'সিস্টেম' ডিএলএল এ রাখুন।
  • আপনার যদি কখনও কোনও বিশেষ হ্যান্ডলিং করার প্রয়োজন হয় বা ত্রুটিগুলি ডিবাগ করার জন্য কেবল ব্রেক ব্রেকপয়েন্টে রাখতে চান তবে আপনার এটি সমস্ত একটি জায়গায় রয়েছে।
  • আপনি যদি কখনও এলমা থেকে দূরে সরে যান তবে আপনি কেবল একটি জায়গা পরিবর্তন করতে পারেন।
  • যদি আপনার লিগ্যাসি ত্রুটি লগিং থাকে তবে আপনি ধরে রাখতে চান (কিছুটা ইউআইতে বাঁধা একটি সাধারণ ত্রুটি লগিং প্রক্রিয়া আমার কাছে ঘটেছিল যা আমি অবিলম্বে অপসারণের জন্য সময় পাই না)।

দ্রষ্টব্য: আমি প্রাসঙ্গিক তথ্যের জন্য একটি 'প্রসঙ্গত মেসেজ' সম্পত্তি যুক্ত করেছি। আপনি যদি পছন্দ করেন তবে এটি বাদ দিতে পারেন তবে আমি এটি খুব দরকারী বলে মনে করি। এলমা স্বয়ংক্রিয়ভাবে ব্যতিক্রমগুলি মুছে ফেলে তাই অন্তর্নিহিত ব্যতিক্রমটি লগের মধ্যে এখনও জানানো হবে তবে আপনি যখন এটি ক্লিক করবেন তখন প্রাসঙ্গিক ম্যাসেজটি দৃশ্যমান হবে।


1
দুর্দান্ত উত্তর। হতে পারে ELMAH বাক্সের বাইরেও অনুরূপ কিছু বাস্তবায়ন করা উচিত। কখনও কখনও প্রসঙ্গ ছাড়াই ত্রুটি ডিবাগ করা সত্যিই কঠিন।
ra00l

2
আমি সমস্ত পছন্দ করি তবে এর সাথে কোনও গৌণ ত্রুটি গিলে ফেলেছি // uh oh! just keep going। যদি আমার ত্রুটিটি পরিচালনা করতে ব্যর্থ হয় তবে আমি জানতে চাই। আমি এটি কিছু শব্দ করতে চান।
জেরেমি কুক

3
@ জেরেমি কুক আমি সম্মত, তবে এই সতর্কতার সাথে আপনি যদি সতর্ক হন না তবে ব্যর্থতা হ্যান্ডলিংয়ের রুটিনগুলি নিজেরাই ফোন করে এবং পরে উড়িয়ে দেবে oh এই উত্তরটির জন্য আমার সম্ভবত এটি ছেড়ে দেওয়া উচিত ছিল না তবে এর আগে এমন ঘটনার সাথে আমার খারাপ অভিজ্ঞতা হয়েছিল
সাইমন_উইভার

1
এটি এক্সটেনশন পদ্ধতি হিসাবে আরও ভাল ইমো হবে।
স্টিফেন কেনেডি

1
আপনি ভাবছেন: নাহ, আমি কতগুলি ম্যানুয়াল ত্রুটি সম্ভবত লগ ইন করার চেষ্টা করতে পারি? আমি ভেবেছিলাম, প্রায় এক বছর আগে। দীর্ঘ গল্প সংক্ষিপ্ত: এই মোড়ক ব্যবহার করুন!
nmit026

29

আপনি ব্যতিক্রম না বাড়িয়ে কোনও ইস্যু লগ করতে এলমাহ.এররর সিগন্যাল () পদ্ধতিটি ব্যবহার করতে পারেন।

try
{
    // Some code
}
catch(Exception ex)
{
    // Log error
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

    // Continue
}


14

হ্যা এটা সম্ভব. ইএলএমএএইচ নকশাকৃত ব্যতিক্রমগুলি বাধা দেওয়ার জন্য তৈরি করা হয়েছিল। তবে আপনি ত্রুটি সিগন্যাল ক্লাসের মাধ্যমে ELMAH এর ব্যতিক্রম সংকেত দিতে পারেন। এই ব্যতিক্রমগুলি ছুঁড়ে দেওয়া হয় না (বুদবুদ করবেন না), তবে কেবল ELMAH- এ প্রেরণ করা হয়েছে (এবং ত্রুটি-সিগন্যাল শ্রেণির উত্থাপন ইভেন্টের গ্রাহকদের কাছে)।

একটি ছোট উদাহরণ:

protected void ThrowExceptionAndSignalElmah()
{
    ErrorSignal.FromCurrentContext().Raise(new NotSupportedException());
}

13

আমি আমার এমভিসি 4 অ্যাপ্লিকেশনটির মধ্যে থেকে মেলটি সারি করতে শুরু করেছিলাম এমন থ্রেডে আমি একই জিনিসটি দেখার চেষ্টা করছিলাম, যেমন একটি ব্যতিক্রম উত্থাপিত হওয়ার সময় আমার কাছে এইচটিটিপি কনটেক্সট উপলব্ধ ছিল না। এটি করার জন্য আমি এই প্রশ্ন এবং এখানে পাওয়া অন্য একটি উত্তরের উপর ভিত্তি করে নিম্নলিখিতটি দিয়ে শেষ করেছি: এলামাহ: এইচটিটিপি কনটেক্সট ব্যতীত ব্যতিক্রম?

কনফিগ ফাইলে আমি একটি অ্যাপ্লিকেশন নাম নির্দিষ্ট করেছি:

<elmah>
    <security allowRemoteAccess="false" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ELMAH" applicationName="myApplication"/>   
</elmah>

তারপরে কোডে (উপরে বর্ণিত উত্তরটির মতো, তবে এইচটিটিপি কনটেক্সট ছাড়াই) আপনি এইচটিটিপি কনটেক্সটের পরিবর্তে নাল পাস করতে পারবেন:

ThreadPool.QueueUserWorkItem(t => {
     try {
         ...
         mySmtpClient.Send(message);
     } catch (SomeException e) {
         Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(e));
     }
 });

আমি আপনার সমাধান পছন্দ করি; তবে আমি "এলমা" সমাধান করতে অক্ষম। আমার প্রকল্পে আমি "এলমা ব্যবহার করে" যোগ করার চেষ্টা করেছি; আমার কোডে, তবে এটি আমার বর্তমান প্রসঙ্গে নেই।
জঘন্য

@ টেরিয়াস আপনার packages.configচেহারাটি কেমন দেখাচ্ছে? : আপনি ভালো কিছু দেখতে পাও কি <package id="elmah" version="1.2.2" targetFramework="net45" /> <package id="elmah.corelibrary" version="1.2.2" targetFramework="net45" /> <package id="elmah.sqlserver" version="1.2" targetFramework="net45" />'? আপনি নিউজিইটি দিয়ে ইনস্টল করেছেন?
ম্যাথু

আমি হ্যাঁ বলতে চাই, তবে আমার প্রকল্পটি বর্তমানে উত্স নিয়ন্ত্রণে লক করা আছে। আমি প্রকল্পের নমুনা কনফিগারেশন ফাইল থেকে নিজেই এলাহাকে প্রয়োগ করেছি implemented
বিরক্তিজনক

@ টেয়ারসিয়াস যদি এটি ম্যানুয়ালি করে থাকে, আপনি কি ব্যবহারের অনুরোধ করার আগে এই প্রকল্পের জন্য এলমাহ রেফারেন্স যুক্ত করেছিলেন ... আমি এটি যে কোনও উপায়ে কাজ করার প্রত্যাশা করব, তবে আমি জানি যে নুগেট যখন এটি যুক্ত করে উপরের রেখাগুলি যুক্ত হবেpackages.config
ম্যাথিউ

3

কখনও কখনও CurrentHttpContextউপলব্ধ নাও হতে পারে।

নির্ধারণ করা

public class ElmahLogger : ILogger
{
    public void LogError(Exception ex, string contextualMessage = null, bool withinHttpContext = true)
    {
        try
        {
            var exc = contextualMessage == null 
                      ? ex 
                      : new ContextualElmahException(contextualMessage, ex);
            if (withinHttpContext)
                ErrorSignal.FromCurrentContext().Raise(exc);
            else
                ErrorLog.GetDefault(null).Log(new Error(exc));
        }
        catch { }
    }
}

ব্যবহার

public class MyClass
{
    readonly ILogger _logger;

    public MyClass(ILogger logger)
    {
        _logger = logger;
    }

    public void MethodOne()
    {
        try
        {

        }
        catch (Exception ex)
        {
            _logger.LogError(ex, withinHttpContext: false);
        }
    }
}

2

আমি এএসপি.এনইটি কোর-এ আছি এবং আমি এলহামকোর ব্যবহার করি

HTTPContext (নিয়ন্ত্রক) এর মাধ্যমে ম্যানুয়ালি ত্রুটিগুলি লগ করতে কেবল লিখুন:

using ElmahCore;
...
HttpContext.RiseError(new Exception("Your Exception"));

HttpContext ছাড়াই আপনার আবেদনের অন্য অংশে :

using ElmahCore;
...
ElmahExtensions.RiseError(new Exception("Your Exception"));

0

আমি সিগন্যাল ব্যবহার করে এলাহাম লগগুলিতে কাস্টম বার্তাগুলি লেখার চেষ্টা করছিলাম romফ্রোম্যাকারেন্টকন্টেক্সট ()। উত্থাপন (প্রাক্তন); এবং দেখা গেছে যে এই ব্যতিক্রমগুলি বুদবুদ হয়েছে, যেমন:

try
{
    ...
}
catch (Exception ex)
{
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
    // this will write to the log AND throw the exception
}

এ ছাড়া আমি দেখতে পাচ্ছি না যে এলমা কীভাবে বিভিন্ন স্তরের লগিং সমর্থন করে - ওয়েবকনফিগ সেটিং দ্বারা ভার্বোজ লগিং বন্ধ করা কি সম্ভব?


1
যদি আপনি একটি ব্যতিক্রম ধরা পড়ে এবং এটি আবার ছুঁড়ে না ফেলে তবে ব্যতিক্রমগুলি বুদ্বুদ হয় না। আমি ভুল বুঝতে পারি? ELMAH বিভিন্ন স্তরের লগিং সমর্থন করে না। এটি শুধুমাত্র ত্রুটির জন্য।
টমাসআর্ডাল

ধন্যবাদ, টমাস এটিই আমি নিশ্চিত করার চেষ্টা করছিলাম
ভ্যালারি গ্যারিলভ

0

এই লাইনটি ব্যবহৃত হয়েছে এবং এটি পুরোপুরি সূক্ষ্মভাবে কাজ করে।

 try{
            //Code which may throw an error
    }
    catch(Exception ex){
            ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(ex));
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.