.NET- এ লগিং এবং ট্রেস করার জন্য সেরা অনুশীলন


53

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

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

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

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

এখন, আমি শুধুমাত্র মান .NET ক্লাস, সেই ব্যবহার করে আমার হদিশ এবং লগিং কাজ করতে চান বলে System.Diagnosticsনামস্থান। আমি টের পেয়েছি যে ট্রেসসোর্স ক্লাসটি স্ট্যাটিক ট্রেস ক্লাসের চেয়ে কাজের জন্য ভাল, কারণ আমি ট্রেস স্তরের মধ্যে পার্থক্য করতে চাই এবং ট্রেসসোর্স ক্লাস ব্যবহার করে আমি ইভেন্টের ধরণের তথ্য জানাতে একটি প্যারামিটারে পাস করতে পারি, ট্রেস ক্লাসটি ব্যবহার করার সময় আমার অবশ্যই ব্যবহার করা উচিত Trace.WriteLineIfএবং তারপর ভালো জিনিস যাচাই SourceSwitch.TraceInformationএবং SourceSwitch.TraceErrors, এবং এটা এমনকি মত বৈশিষ্ট্য নেই TraceVerboseবা TraceStart

এই সমস্ত বিষয় মাথায় রেখে, আপনি কি নীচের মতো করে একটি ভাল অনুশীলন বিবেচনা করবেন:

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

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

দ্রষ্টব্য: আমি এখানে কিছু ভাল তথ্য পেয়েছি, তবে এখনও আমি যা খুঁজছি তা তা খুঁজে পায় না: http://msdn.microsoft.com/en-us/magazine/ff714589.aspx



লগিংয়ের জন্য ভাল প্যাটার্স ব্যবহার করে কোনও সম্পূর্ণ উত্স কোড নমুনা অ্যাপ্লিকেশন?
কিকিনেট

সত্যিই ... আমি যদি নেট সাথে কাজ করতাম তবে আমি সম্ভবত নিউ রেলিকের মতো কিছু ইনস্টল করে এটিকে কল করে বলতাম। (যদিও এটি পোস্ট করার সময় ভাল বিকল্প নয়)
এসভিডজেন

উত্তর:


17

ট্রেস কোডের কোডটি কোথায় রয়েছে তার কারণেই ট্রেস প্রকারের গুরুত্ব অবশ্যই বেছে নেওয়া উচিত নয়, কারণ ট্রেস করা বার্তাটি কম বেশি গুরুত্বপূর্ণ। উদাহরণ:

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

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

এটি বলা হচ্ছে, বেশিরভাগ ক্ষেত্রে, পদ্ধতিটির শুরুতে আসলে একটি যৌক্তিক অপারেশন শুরু হবে। অন্যথায়, আপনার নিজের জিজ্ঞাসা করা উচিত কোডটি সঠিকভাবে সংশোধন করা হয়েছে কিনা।

প্যারামিটারগুলি সন্ধান করাও একটি খারাপ ধারণা হতে পারে । আপনার কী ভাবতে হবে কেস কেস, কেস কেস কেসে। উদাহরণস্বরূপ কোনও পদ্ধতির পরামিতিগুলি সনাক্ত করা সত্যিই খারাপ void Authenticate(string userName, string plainPassword)

ডাটাবেসে কোনও আইটেম সন্নিবেশ করানোর সময় একটি "তথ্য" ইভেন্টের সন্ধান করুন।

এটা নির্ভর করে. কিছু আইটেম অবশ্যই সনাক্ত করা উচিত, কিন্তু প্রতিটি আইটেম নয়।

  • উদাহরণস্বরূপ কল্পনা করুন যে আপনি আসলে আপনার ডেটাবেজে একটি লগ আইটেম সন্নিবেশ করছেন। আপনি কি লগগুলি ট্রেস করবেন? এবং তারপরে লগ ইন করুন? এবং তারপর ট্রেস লগিং ট্রেস?
  • আর একটি উদাহরণ: আপনি একটি সংবেদনশীল ডেটা tingোকাচ্ছেন। এর জন্য নিরীক্ষণ প্রয়োজন। আপনি যেহেতু সন্নিবেশটি নিরীক্ষণ করেছেন, কেন এটি সন্ধান করছেন?

গুরুত্বপূর্ণ / / অন্য বিবৃতিতে একটি পথ বা অন্য পথে যাওয়ার সময় একটি "তথ্য" ইভেন্টের সন্ধান করুন।

আবার, এটি নির্ভর করে।

আবহাওয়ার উপর নির্ভর করে ক্যাচ ব্লকে একটি "সমালোচক" বা "ত্রুটি" সন্ধান করুন এটি একটি পুনরুদ্ধারযোগ্য ত্রুটি।

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

পদ্ধতির কার্য সম্পাদন শেষ করার পরে একটি "স্টপ" ইভেন্ট সন্ধান করুন।

প্রথম পয়েন্ট দেখুন।

ভারবোজ এবং সতর্কতা ইভেন্টের ধরণগুলি কখন সন্ধান করা যায় তা দয়া করে স্পষ্ট করুন।

শব্দবহুল:

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

আপনার কাছে সাধারণত প্রচুর ভারবোজ বার্তা থাকে যা আপনাকে অ্যাপ্লিকেশন প্রবাহকে খুব ভালভাবে বুঝতে দেয়। এর অর্থ হ'ল এই বার্তাগুলি বেশিরভাগ সময় অক্ষম করতে হবে কারণ:

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

আপনার যখন ডিবাগারে অ্যাক্সেস নেই তখন আপনাকে একটি সরঞ্জাম হিসাবে ভারবোজ সম্পর্কে ভাবুন ose

সতর্কতা:

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

উদাহরণ:

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

  • উদাহরণ 2: প্রথম উদাহরণে ত্রুটিটি পরিদর্শন করার পরে, আপনি দেখতে পেয়েছেন যে ফাইলটি 259 অক্ষরের চেয়ে দীর্ঘ লম্বা হওয়ার কারণে ত্রুটিটি ঘটেছিল। সুতরাং আপনি ধরা আপনার কোড রিফ্যাক্টর PathTooLongException। পরের বার, ব্যবহারকারী যখন একই ফাইলটি খোলার চেষ্টা করবেন, তখন অ্যাপ্লিকেশনটির নতুন সংস্করণটি একটি বার্তা দেখায় যাতে বোঝানো হয় যে ফাইলটি অনেক দীর্ঘ এবং এই ফাইলটি খোলার জন্য পুরো পথটি ছোট করার জন্য অন্য ফোল্ডারে যেতে হবে এই আবেদন. আপনি একটি বার্তা ট্রেসও ।

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

  • উদাহরণ 4: খোলা ফাইলটি ভুলভাবে প্রদর্শিত হয়। আপনি ভার্বোজের ট্রেস সক্ষম করে যেখানে আপনি বাস্তবে দেখেন কীভাবে ফাইল থেকে ডেটা লোড করা হয় এবং তারপরে পদক্ষেপে ধাপে পার্স করা হয়।


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

5
 > say I want to do my tracing and logging using only the standard .NET classes

System.Diagnostics দুর্দান্ত কারণ আপনি কোথায় কনফিগার করতে পারেন কোন ট্রেস-তথ্য কোথায় যাওয়া উচিত (ফাইল, ইভেন্টলগ, ডাটাবেস, ....)

দুর্ভাগ্যক্রমে, আপনি যদি ব্যবহার করতে চান তবে আপনাকে System.Diagnosticsঅবশ্যই আগে থেকেই জানতে হবে ( ডিজাইনের সময় ), কোন ট্রেস-স্ট্রিমগুলি অনুসরণ করা সম্ভব। (উদাহরণ নিবন্ধে এগুলি হস্তান্তর, পুনরায় শুরু, স্থগিতকরণ, ...)। এগুলি অক্ষম, ডাবলগেল বা ত্রুটিযুক্তের জন্য কনফিগার করা যেতে পারে।

আমি লগিং সিস্টেমটি পছন্দ করি যেখানে আমি ক্লাসলেভেল / নেমস্পেসিলেলে রানটাইমে সিদ্ধান্ত নিতে পারি, লগিংটি কতটা বিশদ হওয়া উচিত। উদাহরণস্বরূপ, সমস্ত ডিবাগ এবং উপরের MyNamespace.Business.*তবে নয় MyNamespace.Business.Calculations

আপনি যদি লগ 4 নেট (বা কমন.লগিং) ব্যবহার করছেন তবে প্রতিটি শ্রেণি তার নিজস্ব লগার পেয়েছে যাতে আপনি সহজেই সিদ্ধান্ত নিতে পারেন কোন স্তরের কোন স্তরে লগইন হবে।

যেহেতু ডেটাবেস অপারেশনগুলি পৃথক শ্রেণিতে রয়েছে, তাই আলাদা ব্যবস্থার দরকার নেই

Trace an "Information" event when inserting an item into the database.

পরিবর্তে আমি এই নির্দেশিকা থাকা পছন্দ:

  • ট্র্রেসিলভেলটি মূল কর্মপ্রবাহ দেখানো উচিত
  • ডাব্লগেলভেলকে কার্যপ্রবাহের মধ্যে বিশদ ডেটা এবং প্রক্রিয়াকরণ প্রদর্শন করা উচিত, কারণগুলি সহ প্রোগ্রামফ্লোতে সিদ্ধান্ত সহ (নতুন আইটেম তৈরি করা কারণ আইটেমটি ডিবিতে ছিল না)
  • পরিষেবাগুলি শুরু / বন্ধ করার জন্য ইনফোলভেল এবং প্রতিটি কর্মপ্রবাহ / জিইআইআই ক্রিয়াকলাপের জন্য একটি করে প্রবেশ শুরু হয়েছিল

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

4

আপনি গল্পের কাঠামোটি চেষ্টা করে দেখতে পারেন , লগ করার ক্ষেত্রে এটির একটি অনন্য দৃষ্টিভঙ্গি রয়েছে কারণ আপনি সমস্ত লগগুলি "তৈরি" করেন (এবং অন্যান্য প্রাসঙ্গিক তথ্য যোগ করেন) প্রসঙ্গে যাতে আপনাকে যখন পরে এটি পড়তে হয় তখন আপনার প্রয়োজনীয় সমস্ত জিনিস পাওয়া যায়।

এটি স্বয়ংক্রিয়ভাবে একটি গল্পের শুরু এবং শেষ হিসাবে "শুরু" এবং "থামুন" ধারণাগুলি যুক্ত করবে।

এবং একটি নিয়ম-ভিত্তিক সিস্টেমের মাধ্যমে আপনি প্রতিটি তথ্যের (প্রসঙ্গ) সাথে থাকা তথ্যের উপর নির্ভর করে কী করবেন তা নিয়ন্ত্রণ করতে পারেন, উদাহরণস্বরূপ ত্রুটিযুক্ত বা "প্রশাসক" ব্যবহারকারীর কাছ থেকে আসা সমস্ত গল্প মুদ্রণ করুন।

এছাড়াও এই ব্লগ পোস্টে আরও তথ্য



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