বিশ্বব্যাপী অনন্য বার্তা আইডি ব্যবহার করে কোড সন্ধানযোগ্য


39

বাগ চিহ্নিত করার জন্য একটি সাধারণ প্যাটার্নটি এই স্ক্রিপ্টটি অনুসরণ করে:

  1. অদ্ভুততা লক্ষ্য করুন, উদাহরণস্বরূপ, কোনও আউটপুট বা একটি ঝুলন্ত প্রোগ্রাম।
  2. লগ বা প্রোগ্রাম আউটপুটে প্রাসঙ্গিক বার্তা সনাক্ত করুন, উদাহরণস্বরূপ, "ফু খুঁজে পাওয়া যায়নি"। (ত্রুটিটি সনাক্ত করার জন্য যদি এই পথটি অনুসরণ করা হয় তবে নিম্নলিখিতটি কেবলমাত্র প্রাসঙ্গিক। যদি স্ট্যাক ট্রেস বা অন্যান্য ডিবাগিং তথ্য সহজেই উপলব্ধ হয় তবে এটি অন্য গল্প)
  3. বার্তাটি মুদ্রিত হয়েছে এমন কোডটি সন্ধান করুন।
  4. প্রথম স্থান ফুতে প্রবেশ করে (অথবা প্রবেশ করা উচিত) ছবি এবং যেখানে বার্তাটি প্রিন্ট করা হয়েছে তার মধ্যে কোডটি ডিবাগ করুন।

তৃতীয় পদক্ষেপটি যেখানে ডিবাগিং প্রক্রিয়াটি প্রায়শই থামতে ডুবে থাকে কারণ কোডে এমন অনেক জায়গা রয়েছে যেখানে "ফু খুঁজে পাওয়া যায়নি" (বা একটি টেম্প্লেটেড স্ট্রিং Could not find {name}) মুদ্রিত হয়। প্রকৃতপক্ষে, বেশ কয়েকবার বানান ভুল আমাকে সত্যিকারের অবস্থানটি আমার অন্যথায় যে চেয়ে দ্রুত করতে সাহায্য করেছিল - তা পুরো সিস্টেম জুড়ে এবং প্রায়শই বিশ্বজুড়ে অনন্য করে তোলে যার ফলে কোনও প্রাসঙ্গিক অনুসন্ধান ইঞ্জিন তত্ক্ষণাত আঘাত হানে।

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


54
পরিবর্তে আপনার স্ট্যাক ট্রেস ব্যবহার করুন। স্ট্যাক ট্রেস কেবল ত্রুটিটি কোথায় ঘটেছে তা আপনাকে সঠিকভাবে বলবে না, তবে প্রতিটি ফাংশন যা এটি বলে যে প্রতিটি ফাংশন বলে। কোনও ব্যতিক্রম ঘটলে সম্পূর্ণ ট্রেস লগইন করুন, প্রয়োজনে। আপনি যদি এমন ভাষায় কাজ করছেন যা সি এর মতো ব্যতিক্রম না করে তবে এটি অন্যরকম গল্প।
রবার্ট হার্ভে

6
@ l0b0 শব্দের বিষয়ে একটি ছোট্ট পরামর্শ। "এই সম্প্রদায়টি কী বলে ... ... এটি এমন একটি সাইট যা "ভাল সাবজেক্টিভ" প্রশ্নগুলির জন্য অনুমতি দেয় এবং এই ধরণের প্রশ্নগুলির অনুমতি দেওয়ার পরিবর্তে, ওপি হিসাবে আপনি একটি অর্থবহ conকমত্যের পক্ষে মন্তব্য এবং উত্তরগুলি "রাখাল" করার কাজটি করবেন বলে আশা করা হবে।
রওয়ং

@ রওং আপনাকে ধন্যবাদ! আমি মনে করি যে প্রশ্নটি ইতিমধ্যে একটি খুব ভাল এবং পয়েন্ট সাড়া পেয়েছে, যদিও এটি কোনও ফোরামে আরও ভাল জিজ্ঞাসা করা হতে পারে। জন ওয়াউয়ের স্পষ্টকামী প্রতিক্রিয়া পড়ার পরে আমি রবার্টহার্য়ের মন্তব্যে আমার প্রতিক্রিয়া প্রত্যাহার করেছিলাম, যদি আপনি সেই বিষয়টিকেই উল্লেখ করছেন। যদি তা না হয় তবে আপনার কাছে রাখালীর কোনও নির্দিষ্ট পরামর্শ রয়েছে?
l0b0

1
আমার বার্তাগুলি দেখে মনে হচ্ছে "কল টু বার () এর সময় ফু খুঁজে পাওয়া যায়নি"। সমস্যা সমাধান. অসহায়তা। গ্রাহকরা এটি দেখতে পাচ্ছেন এটি সামান্য ফাঁস, তবে আমরা তাদের কাছ থেকে ত্রুটি বার্তাগুলির বিবরণ যেভাবেই হোক লুকিয়ে রাখি, এটি কেবল সিসাদমিনদের জন্য উপলব্ধ করা হয় যারা বানরকে কিছু দিতে পারে না যে তারা কিছু ফাংশনের নাম দেখতে পাবে। এটি ব্যর্থ হয়ে, হ্যাঁ, একটি দুর্দান্ত সামান্য অনন্য আইডি / কোডটি কৌশলটি করবে।
মনিকার সাথে লাইটনেস রেস

1
যখন কোনও গ্রাহক আপনাকে ফোন দেয়, এবং তাদের কম্পিউটারটি ইংরাজীতে চলছে না তখন এটি খুব কার্যকর! আমাদের কাছে এখন ইমেল এবং লগ ফাইল থাকায় এই দিনগুলির খুব কমই .....
ইয়ান

উত্তর:


12

সামগ্রিকভাবে এটি একটি বৈধ এবং মূল্যবান কৌশল। এখানে কিছু চিন্তা।

এই কৌশলটি এই অর্থে "টেলিমেট্রি" হিসাবেও পরিচিত, যখন এ জাতীয় সমস্ত তথ্য একত্রিত করা হয় তখন তারা কার্যকরকরণের ট্রেসটিকে "ত্রিভঙ্গীকরণ" করতে সহায়তা করে এবং ব্যবহারকারী / অ্যাপ্লিকেশন কী অর্জন করতে চাইছে এবং আসলে কী ঘটেছিল তা বোঝার জন্য সমস্যা সমাধানকারীকে মঞ্জুরি দেয় ।

কিছু প্রয়োজনীয় টুকরো তথ্য যা অবশ্যই সংগ্রহ করতে হবে (যা আমরা সবাই জানি) হ'ল:

  • কোডের অবস্থান, যেমন কল স্ট্যাক এবং কোডের আনুমানিক লাইন
    • "আনুমানিক লাইন কোডের" প্রয়োজন হয় না যদি ফাংশনগুলি যথাযথভাবে ছোট ছোট ইউনিটে বিভক্ত হয়।
  • ফাংশনটির সাফল্য / ব্যর্থতার সাথে প্রাসঙ্গিক কোনও উপাত্তের টুকরো
  • একটি উচ্চ-স্তরের "কমান্ড" যা মানব ব্যবহারকারী / বহিরাগত এজেন্ট / এপিআই ব্যবহারকারীর দ্বারা সম্পাদন করার চেষ্টা করছে তা পেরে উঠতে পারে।
    • ধারণাটি হ'ল কোনও সফ্টওয়্যার কোথাও থেকে আসা আদেশগুলি গ্রহণ করবে এবং প্রক্রিয়া করবে।
    • এই প্রক্রিয়া চলাকালীন, কয়েক ডজন থেকে কয়েক হাজার থেকে হাজার হাজার ফাংশন কলগুলি হয়ত লেগেছিল।
    • আমরা চাই যে এই প্রক্রিয়াজুড়ে যে কোনও টেলিমেট্রি তৈরি করা যায় তা সর্বোচ্চ স্তরের কমান্ডের কাছে ফিরে পাওয়া যায় যা এই প্রক্রিয়াটিকে ট্রিগার করে।
    • ওয়েব-ভিত্তিক সিস্টেমগুলির জন্য, মূল এইচটিটিপি অনুরোধ এবং এর ডেটা এই জাতীয় "উচ্চ-স্তরের অনুরোধ তথ্যের" উদাহরণ
    • জিইউআই সিস্টেমগুলির জন্য, ব্যবহারকারী কোনও কিছুর উপর ক্লিক করে এই বিবরণটি মাপসই করে।

প্রায়শই, traditionalতিহ্যবাহী লগিং পদ্ধতিগুলি ছোট হয়ে যায়, কারণ নিম্ন-স্তরের লগ বার্তাটি সর্বাধিক স্তরের কমান্ডে ফিরে আসে যা এটি ট্রিগার করে। একটি স্ট্যাক ট্রেস কেবলমাত্র উচ্চ-আপ ক্রিয়াকলাপগুলির নাম ক্যাপচার করে যা সর্বাধিক স্তরের কমান্ড পরিচালনা করতে সহায়তা করে, কখনও কখনও সেই আদেশটি চিহ্নিত করার জন্য প্রয়োজনীয় বিবরণ (ডেটা) নয়।

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

সুতরাং, টেলিমেট্রি থেকে সর্বাধিক মান পেতে, সামগ্রিক সফ্টওয়্যার আর্কিটেকচারে পরিবর্তন প্রয়োজন। বেশিরভাগ ইন্টারফেস এবং ফাংশন কলগুলিতে একটি "ট্রেসার" যুক্তি গ্রহণ এবং প্রচার করতে সংশোধন করা দরকার।

এমনকি ইউটিলিটি ফাংশনগুলিতে একটি "ট্রেসার" যুক্তি যুক্ত করা দরকার, যাতে এটি ব্যর্থ হলে লগ বার্তাটি একটি নির্দিষ্ট উচ্চ-স্তরের কমান্ডের সাথে নিজেকে সম্পর্কযুক্ত করতে দেয়।

টেলিমেট্রি ট্রেসিংকে আরও কঠিন করে তুলবে এমন একটি ব্যর্থতা হ'ল অবজেক্ট রেফারেন্স (নাল পয়েন্টার বা রেফারেন্স) missing যখন ডেটাটির কিছু গুরুত্বপূর্ণ অংশ অনুপস্থিত থাকে, ব্যর্থতার জন্য দরকারী কিছু রিপোর্ট করা অসম্ভব হতে পারে।

লগ বার্তা লেখার ক্ষেত্রে:

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

1
প্রকৃতপক্ষে, এওপি কোডটি বেস ন্যূনতম আক্রমণ সহ প্রতিটি প্রাসঙ্গিক কলটিতে ট্রেসার যুক্ত করে - এই সমস্যাটি সমাধান করার জন্য তার অন্তর্নিহিত ক্ষমতাটি প্রাথমিকভাবে বলেছে।
বিশপ 14

আমি "লগ বার্তা লেখার" তালিকায় আরও যুক্ত করব যে "কেন" এবং "কীভাবে" ঠিক হয়েছে তার পরিবর্তে "কেন" ঠিক করতে হবে "শর্তে ব্যর্থতা চিহ্নিত করা গুরুত্বপূর্ণ।
বিশপ 14

58

কল্পনা করুন আপনার একটি তুচ্ছ ইউটিলিটি ফাংশন রয়েছে যা আপনার কোডের কয়েকশ জায়গায় ব্যবহৃত হয়:

decimal Inverse(decimal input)
{
    return 1 / input;
}

আপনার পরামর্শ অনুসারে আমরা যদি করতাম তবে আমরা লিখতে পারি

decimal Inverse(decimal input)
{
    try 
    {
        return 1 / input;
    }
    catch(Exception ex)
    {
        log.Write("Error 27349262 occurred.");
    }
}

যে ত্রুটি ঘটতে পারে তা হ'ল যদি ইনপুটটি শূন্য হয়; এর ফলে শূন্য ব্যতিক্রম দ্বারা বিভাজন হবে।

সুতরাং আসুন আমরা আপনার আউটপুট বা আপনার লগগুলিতে 27349262 দেখতে পাচ্ছি see শূন্য মানটি পাস করা কোডটি আপনি কোথায় খুঁজছেন? মনে রাখবেন, ফাংশনটি - এর অনন্য আইডি সহ - কয়েকশ জায়গায় ব্যবহৃত হয়। সুতরাং আপনি যখন জানতে পারবেন যে শূন্য দ্বারা বিভাজন ঘটেছে, আপনি 0এটি জানেন না যে এটি কার।

আমার মনে হচ্ছে আপনি যদি বার্তা আইডি লগ করতে বিরক্ত হন তবে আপনি স্ট্যাক ট্রেসটি লগও করতে পারেন।

যদি স্ট্যাক ট্রেসের ভার্বোসটি আপনাকে বিরক্ত করে, রানটাইম আপনাকে যেভাবে দেয় তা আপনাকে স্ট্রিং হিসাবে ফেলে দিতে হবে না। আপনি এটি কাস্টমাইজ করতে পারেন। উদাহরণস্বরূপ, আপনি যদি একটি সংক্ষিপ্ত স্ট্যাক ট্রেস কেবল nমাত্রায় যেতে চান তবে আপনি এই জাতীয় কিছু লিখতে পারেন (যদি আপনি সি # ব্যবহার করেন):

static class ExtensionMethods
{
    public static string LimitedStackTrace(this Exception input, int layers)
    {
        return string.Join
        (
            ">",
            new StackTrace(input)
                .GetFrames()
                .Take(layers)
                .Select
                (
                    f => f.GetMethod()
                )
                .Select
                (
                    m => string.Format
                    (
                        "{0}.{1}", 
                        m.DeclaringType, 
                        m.Name
                    )
                )
                .Reverse()
        );
    }
}

এবং এটি এর মতো ব্যবহার করুন:

public class Haystack
{
    public static void Needle()
    {
        throw new Exception("ZOMG WHERE DID I GO WRONG???!");
    }

    private static void Test()
    {
        Needle();
    }

    public static void Main()
    {
        try
        {
            Test();
        }
        catch(System.Exception e)
        {
            //Get 3 levels of stack trace
            Console.WriteLine
            (
                "Error '{0}' at {1}", 
                e.Message, 
                e.LimitedStackTrace(3)
            );  
        }
    }
}

আউটপুট:

Error 'ZOMG WHERE DID I GO WRONG???!' at Haystack.Main>Haystack.Test>Haystack.Needle

বার্তা আইডি বজায় রাখার চেয়ে সহজ এবং আরও নমনীয়।

ডটনেটফিডাল থেকে আমার কোডটি চুরি করুন


32
হুম আমি অনুমান করি আমি আমার বক্তব্যটি যথেষ্ট পরিমাণে পরিষ্কার করি নি। আমি জানি তারা প্রতি কোডের জন্য রবার্ট-- অনন্য কোডের পথে তারা অনন্য নয় অবস্থানটি জানা প্রায়শই অকেজো, উদাহরণস্বরূপ যদি আসল সমস্যাটি হয় যে কোনও ইনপুট সঠিকভাবে সেট করা হয়নি। জোর দেওয়ার জন্য আমি আমার ভাষাটি কিছুটা সম্পাদনা করেছি।
জন উ

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

12
যদি আপনি এতগুলি পান যে আপনি আপনার I / O বন্যার বিষয়ে উদ্বিগ্ন হয়ে পড়েছেন তবে মারাত্মক কিছু ভুল আছে। নাকি আপনি শুধু কৃপণ হয়ে যাচ্ছেন? আসল পারফরম্যান্সের হিটটি সম্ভবত স্ট্যাক আনওয়াইন্ড।
জন উ

9
স্ট্যাকের চিহ্নগুলি সংক্ষিপ্ত করার জন্য একটি সমাধান সহ সম্পাদনা করা হয়েছে, যদি আপনি 3.5 ফ্লপিটিতে লগ লিখছেন;)
জন উউ

7
@ জোহানউইউ এবং [...] "এ" আইওএক্সেপশন 'ফাইল পাওয়া যায় নি' ভুলেও যান না যা কল স্ট্যাকের পঞ্চাশ স্তর সম্পর্কে আপনাকে জানায় কিন্তু সঠিক রক্তাক্ত ফাইলটি কী খুঁজে পাওয়া যায়নি তা জানায় না।
জোকার_ভিডি

6

এসএপি নেটওয়েভার কয়েক দশক ধরে এটি করছে।

এটি একটি মূল্যবান সরঞ্জাম হিসাবে প্রমাণিত হয়েছে যখন প্রচলিত কোড বেহেমথের ত্রুটিজনিত ত্রুটিগুলি যা সাধারণ এসএপি ইআরপি সিস্টেম।

ত্রুটি বার্তাগুলি একটি কেন্দ্রীয় ভান্ডারে পরিচালনা করা হয় যেখানে প্রতিটি বার্তা তার বার্তা শ্রেণি এবং বার্তা নম্বর দ্বারা চিহ্নিত করা হয়।

আপনি যখন কোনও ত্রুটি বার্তাকে আউটপুট করতে চান, আপনি কেবলমাত্র শ্রেণি, সংখ্যা, তীব্রতা এবং বার্তা-নির্দিষ্ট ভেরিয়েবলগুলি স্থির করেন। বার্তার পাঠ্য উপস্থাপনা রানটাইম সময়ে তৈরি করা হয়। আপনি সাধারণত যে কোনও প্রসঙ্গে বার্তাগুলি উপস্থিত হয় সেখানে বার্তা শ্রেণি এবং নম্বর দেখতে পাবেন। এর বেশ কয়েকটি ঝরঝরে প্রভাব রয়েছে:

  • আপনি স্বয়ংক্রিয়ভাবে ABAP কোডবেসে কোডের যে কোনও লাইন খুঁজে পেতে পারেন যা একটি নির্দিষ্ট ত্রুটি বার্তা তৈরি করে।

  • আপনি গতিশীল ডিবাগার ব্রেকপয়েন্টগুলি সেট করতে পারেন যা একটি নির্দিষ্ট ত্রুটি বার্তা উত্পন্ন হওয়ার পরে ট্রিগার করে।

  • আপনি এসএপি জ্ঞান বেস নিবন্ধগুলিতে ত্রুটিগুলি সন্ধান করতে পারেন এবং "ফু খুঁজে পেলেন না" এর চেয়ে বেশি প্রাসঙ্গিক অনুসন্ধান ফলাফল পেতে পারেন।

  • বার্তাগুলির পাঠ্য উপস্থাপনা অনুবাদযোগ্য। সুতরাং স্ট্রিংয়ের পরিবর্তে বার্তাগুলির ব্যবহারকে উত্সাহিত করে আপনি i18n ক্ষমতাও পাবেন।

বার্তা নম্বর সহ ত্রুটি পপআপের একটি উদাহরণ:

error1

ত্রুটি ভান্ডারটিতে ত্রুটিটি অনুসন্ধান করা হচ্ছে:

error2

কোডবেজে এটি সন্ধান করুন:

error3

তবে ত্রুটি রয়েছে। আপনি দেখতে পাচ্ছেন যে কোডগুলির এই লাইনগুলি আর স্ব-ডকুমেন্টিং নয়। আপনি যখন সোর্সকোডটি পড়েন এবং MESSAGEউপরের স্ক্রিনশটের মতো একটি বিবৃতি দেখতে পান , আপনি কেবলমাত্র এর প্রাসঙ্গিক বিষয়টি থেকে অনুমান করতে পারবেন যে এটির অর্থ কী। এছাড়াও, কখনও কখনও লোকেরা কাস্টম ত্রুটি হ্যান্ডলারগুলি প্রয়োগ করে যা রানটাইমের সময় বার্তা বর্গ এবং নম্বর প্রাপ্ত করে। সেক্ষেত্রে ত্রুটিটি স্বয়ংক্রিয়ভাবে সন্ধান করা যায় না বা যেখানে ত্রুটিটি আসলে ঘটেছিল সেখানে পাওয়া যায় না। প্রথম সমস্যার সমাধানের কাজটি হ'ল পাঠকের বার্তার অর্থ কী তা বোঝাতে সোর্সকোডে সর্বদা একটি মন্তব্য যুক্ত করা অভ্যাস করা। দ্বিতীয়টি স্বয়ংক্রিয় বার্তাপ্রদর্শন কাজ করে তা নিশ্চিত করার জন্য কিছু ডেড কোড যুক্ত করে সমাধান করা হয়। উদাহরণ:

" Do not use special characters
my_custom_error_handler->post_error( class = 'EU' number = '271').
IF 1 = 2.
   MESSAGE e271(eu).
ENDIF.    

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


বার্তা ক্যাটালগগুলি কিছু সময়ের জন্য জিএনইউ / লিনাক্স - এবং ইউনিক্সের সাধারণত পসিক্স স্ট্যান্ডার্ড হিসাবে অন্তর্ভুক্ত ছিল ।
বিশপ

@ বিশপ আমি সাধারণত পসিক্স সিস্টেমগুলির জন্য বিশেষত প্রোগ্রামিং করি না, তাই আমি এর সাথে পরিচিত নই। হতে পারে আপনি অন্য একটি উত্তর পোস্ট করতে পারেন যা POSIX বার্তা ক্যাটালগগুলি ব্যাখ্যা করে এবং ওপি তাদের বাস্তবায়ন থেকে কী শিখতে পারে।
ফিলিপ

3
আমি এমন একটি প্রকল্পের অংশ ছিল যা ষাটের দশকে এটি ফিরে এসেছিল। একটি বিষয় যা আমরা লক্ষ্য করেছি তা হ'ল, সমস্ত কিছুর পাশাপাশি আমরা "ডেটাবেজে সংযোগ করতে পারিনি" ডাটাবেসটিতে মানব বার্তা রেখেছি।
জিমি জেমস

5

এই পদ্ধতির সাথে সমস্যাটি হ'ল এটি আরও বেশি বিস্তারিত লগিংয়ের দিকে নিয়ে যায়। 99.9999% যার মধ্যে আপনি কখনই তাকাবেন না।

পরিবর্তে, আমি আপনার প্রক্রিয়া শুরু হওয়ার পরে এবং প্রক্রিয়াটির সাফল্য / ব্যর্থতার সময়ে রাজ্যটি ক্যাপচার করার পরামর্শ দিই।

এটি আপনাকে স্থানীয়ভাবে বাগটি পুনরুত্পাদন করার অনুমতি দেয়, কোডের মাধ্যমে পদক্ষেপ নিচ্ছে এবং প্রতিটি লগিং প্রক্রিয়া অনুযায়ী দুটি স্থানে সীমাবদ্ধ রাখবেন। যেমন।

OrderPlaced {id:xyz; ...order data..}
OrderPlaced {id:xyz; ...Fail, ErrorMessage..}

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

তদ্ব্যতীত, আমি প্রয়োজন হলে কেবলমাত্র লগইন ব্যর্থতা বা অন্য কোথাও রাজ্য রেখে (ডেটাবেস? বার্তা সারি?) আরও বেশি লগিং এড়াতে পারি

স্পষ্টতই সংবেদনশীল ডেটা লগ করার বিষয়ে আমাদের অতিরিক্ত সতর্কতা অবলম্বন করতে হবে। সুতরাং আপনার সমাধানটি যদি বার্তার সারি বা ইভেন্ট স্টোরের প্যাটার্ন ব্যবহার করে তবে এটি বিশেষত ভাল কাজ করে। লগটিতে কেবল "বার্তা xyz ব্যর্থ" বলতে হবে


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

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

ঠিক আছে, কিন্তু এটি পয়েন্ট। এটি অসুস্থ পরামর্শ দেওয়া হয়েছে কারণ তথ্য স্থায়ীভাবে এবং সাধারণত সম্পূর্ণ পরিষ্কার পাঠ্যে থাকে। সংবেদনশীল ডেটাগুলির জন্য, ঝুঁকি নেওয়া এবং আপনি এটির সময়কালটি কোথায় সংরক্ষণ করছেন তা হ্রাস না করা এবং তারপরে আপনি কীভাবে এটি সংরক্ষণ করছেন সে সম্পর্কে খুব সচেতন এবং খুব যত্নশীল হওয়া ভাল।
jpmc26

এটি traditionতিহ্যগতভাবে স্থায়ী কারণ আপনি কোনও ফাইলে লিখছেন। তবে একটি ত্রুটির সারিটি ক্ষণস্থায়ী।
ইভান

আমি বলব যে সম্ভবত সারির প্রয়োগ (এবং সম্ভবত সেটিংস) এর উপরও নির্ভর করে। আপনি এটিকে কোনও কাতারে ফেলে দিতে পারবেন না এবং এটি নিরাপদ থাকার আশা করতে পারেন। এবং সারিটি গ্রাস হওয়ার পরে কী ঘটে? লগগুলি অবশ্যই দেখার জন্য কোথাও থাকা উচিত। অতিরিক্তভাবে, এটি অতিরিক্ত আক্রমণকারী ভেক্টর নয় যা আমি অস্থায়ীভাবেও খুলতে চাই। যদি কোনও আক্রমণে সংবেদনশীল ডেটা সেখানে চলে আসে তা জানতে পারে এমনকি সাম্প্রতিকতম এন্ট্রিগুলি মূল্যবান হতে পারে। এবং তারপরে কেউ কেউ একটি স্যুইচ না জেনে ফ্লিপ না করার ঝুঁকি নিয়ে থাকে তাই এটি ডিস্কেও লগইন শুরু করে। এটি কৃমি মাত্র একটি ক্যান।
jpmc26

1

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

public Foo GetFoo() {

     //Expecting that this should never by null.
     var aFoo = ....;

     if (aFoo == null) Log("Could not find Foo.");

     return aFoo;
}

দেখে মনে হচ্ছে যে ফু-এর অস্তিত্ব নেই এবং এই সমস্যাটি মোকাবেলায় আপনি কোডিং কোড সেট আপ করেন নি এবং আপনার সম্ভবত এটি হওয়া উচিত:

public Foo GetFooById(int id) {
     var aFoo = ....;

     if (aFoo == null) throw new ApplicationException("Could not find Foo for ID: " + id);

     return aFoo;
}

এবং এটি ব্যতিক্রমের সাথে একটি স্ট্যাক ট্রেস ফেরত দেবে যা ডিবাগিংয়ে সহায়তা করতে ব্যবহৃত হতে পারে।

পর্যায়ক্রমে, আমরা যদি প্রত্যাশা করি যে ফিরো পুনরুদ্ধার করা হলে শূন্য হতে পারে এবং এটি ঠিক আছে, আমাদের কলিং সাইটগুলি ঠিক করতে হবে:

void DoSomeFoo(Foo aFoo) {

    //Guard checks on your input - complete with stack trace!
    if (aFoo == null) throw new ArgumentNullException(nameof(aFoo));

    ... operations on Foo...
}

আপনার সফ্টওয়্যারটি অপ্রত্যাশিত পরিস্থিতিতে 'অদ্ভুতভাবে' ঝুলিয়ে দেয় বা কাজ করে তা আমার কাছে ভুল বলে মনে হয় - যদি আপনার কোনও ফু প্রয়োজন হয় এবং এটি না থাকার ব্যবস্থা করতে না পারেন, তবে যে পথে যেতে পারে তার চেষ্টা চালিয়ে যাওয়ার চেয়ে ক্রাশ হওয়া ভাল বলে মনে হয় may আপনার সিস্টেমকে দূষিত করুন।


0

যথাযথ লগিং লাইব্রেরিগুলি সম্প্রসারণের প্রক্রিয়া সরবরাহ করে, সুতরাং আপনি যদি কোনও লগ বার্তা উত্পন্ন করার পদ্ধতিটি জানতে চান তবে তারা বাক্সের বাইরে এটি করতে পারে। এটি কার্যকর করার উপর প্রভাব ফেলে যেহেতু প্রক্রিয়াটির জন্য স্ট্যাক ট্রেস তৈরি করা এবং লগিং লাইব্রেরি থেকে বের হওয়া অবধি এটি ট্র্যাভার করা দরকার।

এটি বলেছিল, আপনি আপনার আইডিটি আপনার জন্য কী করতে চান তা নির্ভর করে:

  • আপনার লগগুলিতে ব্যবহারকারীকে ত্রুটিযুক্ত বার্তা সরবরাহ করা হয়েছে?
  • বার্তাটি উত্পন্ন হওয়ার সময় কোন কোডটি কার্যকর করা হয়েছিল তার স্বরলিপি সরবরাহ করুন?
  • মেশিনের নাম এবং পরিষেবা উদাহরণ ট্র্যাক রাখবেন?
  • থ্রেড আইডি ট্র্যাক রাখতে চান?

এই সমস্ত জিনিস সঠিক লগিং সফ্টওয়্যার (যেমন না Console.WriteLine()বা না Debug.WriteLine()) দিয়ে বাক্সের বাইরে করা যায় ।

ব্যক্তিগতভাবে, এর চেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল মৃত্যুদন্ড কার্যকর করার পথগুলিকে পুনর্গঠন করার ক্ষমতা। জিপকিনের মতো সরঞ্জামগুলি এটি সম্পাদন করার জন্য ডিজাইন করা হয়েছে। সিস্টেম জুড়ে একটি ব্যবহারকারীর ক্রিয়াকলাপটির সন্ধান করতে একটি আইডি। একটি কেন্দ্রীয় অনুসন্ধান ইঞ্জিনে আপনার লগগুলি স্থাপন করে, আপনি কেবলমাত্র দীর্ঘতম চলমান ক্রিয়াগুলি আবিষ্কার করতে পারবেন না, তবে সেই অ্যাকশনটিতে প্রয়োগ হওয়া লগগুলি কল করুন ( ELK স্ট্যাকের মতো )।

প্রতিটি ম্যাসেজের সাথে পরিবর্তিত ওপাক আইডিগুলি খুব কার্যকর নয়। অবিচ্ছিন্ন আইডি হ'ল মাইক্রোসার্ভিসেসের পুরো স্যুটটির মাধ্যমে আচরণটি সনাক্ত করতে ব্যবহৃত হয় ... প্রচুর দরকারী।

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