কেন TRACE স্তর বিদ্যমান এবং আমি কখন এটি ব্যবহার করব DEBUG এর চেয়ে?


82

জাভাতে লগ 4 জে, এসএলফ 4 জে এবং অন্যান্য কয়েকটি লগিং ফ্রেমওয়ার্কগুলিতে আপনার লগিংয়ের জন্য দুটি "বিকাশকারী" স্তর রয়েছে:

  • ত্রুটি মুক্ত করা যায় এমন
  • চিহ্ন

আমি বুঝতে পারি ডিইবিইউজি কী করে, কারণ ব্যাখ্যাটি পরিষ্কার:

ডিইবিইউজি স্তর সূক্ষ্ম-জঞ্জাল তথ্য সম্পর্কিত ইভেন্টগুলি মনোনীত করে যা কোনও অ্যাপ্লিকেশন ডিবাগ করার জন্য সবচেয়ে কার্যকর।

তবে ট্র্যাক স্তরটি এর ব্যবহারের ক্ষেত্রে খুব সুনির্দিষ্ট নয়:

ট্র্যাক স্তরটি DEBUG এর চেয়ে সূক্ষ্ম-বর্ণযুক্ত তথ্য ইভেন্টগুলি মনোনীত করে

(উত্স: লগ 4 জ জাভাডক )

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

এটি, একজন স্থপতি হিসাবে, আমার মাথায় প্রচুর পতাকা এবং প্রশ্ন উত্থাপন করে। একজন তরুণ বিকাশকারী যদি আমাকে আমার স্থাপত্যে ট্র্যাক যোগ করতে বলেন, তবে আমি তাকে প্রশ্ন দিয়ে বোমা দেব:

  • ট্র্যাকের সাথে লগ করা উচিত এবং ডিইবিইউজি দিয়ে নয় এমন তথ্যের কয়েকটি উদাহরণ কী?
  • সেই তথ্য লগ ইন করে আমি কোন নির্দিষ্ট সমস্যাটি সমাধান করব?
  • এই উদাহরণগুলিতে, লগ করা তথ্যের বৈশিষ্ট্যগুলি কী যা ডিইবিইউজি স্তরের পরিবর্তে ট্র্যাক স্তরে লগিংয়ের মধ্যে স্পষ্টভাবে বৈষম্যপূর্ণ?
  • সেই তথ্যটি লগ ইনফ্রাস্ট্রাকচারের মধ্য দিয়ে যেতে হবে কেন?
    • লগ জার্নালে কেবল তথ্য ব্যবহারের চেয়ে সেই তথ্য বজায় রাখার সুবিধা কী System.out.println?
    • ডিবাগারের চেয়ে লগটি কেন ব্যবহার করা ভাল?
  • ট্র্যাক স্তরে লগিংয়ের একটি সাধারণ উদাহরণ কী হবে?
    • উদাহরণস্বরূপ DEBUG এর পরিবর্তে TRACE পর্যায়ে লগ ইন করে সুনির্দিষ্ট লাভগুলি কী কী?
    • কেন এই লাভ গুরুত্বপূর্ণ?
    • বিপরীতে: আমি DEBUG এর পরিবর্তে TRACE এ লগ ইন করে কোন সমস্যা এড়াতে পেরেছি?
    • কীভাবে আমি এই সমস্যাগুলি সমাধান করতে পারি? কেন অন্যান্য সমাধানের চেয়ে ট্র্যাক পর্যায়ে লগইন করা ভাল?
  • ট্র্যাক স্তরের লগ স্টেটমেন্টটি কি প্রোডাকশন কোডে রেখে দেওয়া উচিত? কেন?

তবে এটি বেশিরভাগ প্রধান কাঠামোর উপস্থিতিতে, আমি অনুমান করছি যে এটি কোনও কিছুর জন্য কার্যকর? সুতরাং ... ট্র্যাক কিসের জন্য, এবং এটিকে ডিবিইউজি থেকে আলাদা করে কী?


সেখানে প্রচুর '?' উপরের প্রশ্নে। আমি দৃ strongly়ভাবে প্রশ্নটি এমন একটি দিক থেকে সংকীর্ণ করার পরামর্শ দিচ্ছি যা পুরো উত্তর দেওয়া যেতে পারে (অনেকগুলি আংশিক উত্তরের চেয়ে)।


2
ঠিক আছে, আমি লগিং সম্পর্কে সাধারণ তথ্য জিজ্ঞাসা করছি না। আমি কেবল বুঝতে চাইছি কেন ট্র্যাক স্তর বিদ্যমান এবং কখন আমার এটি ব্যবহার করা উচিত।
লরেন্ট বোর্গোল্ট-রায়

3
@gnat আপনি যে প্রশ্নটিকে সদৃশ হিসাবে চিহ্নিত করেছেন তা আমি পরীক্ষা করে দেখেছি এবং এটি ট্র্যাকের ব্যবহারের ক্ষেত্রে কোথাও ব্যাখ্যা করে না। আমি বিনয়ের সাথে অনুরোধ করতে চাই যে সদৃশ পতাকাটি সরানো হবে। (যদি আপনি এটি যুক্ত প্রশ্নে আমি এটি মিস না করি?)
লরেন্ট বোর্গোল্ট-রায়

1
@ এসডি এটি লগ ৪ জে ১.২ ডকুমেন্টেশন থেকে এসেছে, আমি আমার প্রশ্নের উত্স যুক্ত করেছি।
লরেন্ট বোর্গোল্ট-রায়

উত্তর:


59

ট্র্যাকের সাথে লগ করা উচিত এবং ডিইবিইউজি দিয়ে নয় এমন তথ্যের উদাহরণ কী?

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

সাধারণভাবে, ট্রেস সমস্ত ডিবাগ অন্তর্ভুক্ত করবে (ঠিক তেমনি ডিবাগে সমস্ত সতর্কতা এবং ত্রুটি রয়েছে)।

সেই তথ্য লগ ইন করে আমি কোন নির্দিষ্ট সমস্যাটি সমাধান করব?

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

এই উদাহরণগুলিতে, লগ করা তথ্যের বৈশিষ্ট্যগুলি কী যা ডিইবিইউজি স্তরের পরিবর্তে ট্র্যাক স্তরে লগিংয়ের মধ্যে স্পষ্টভাবে বৈষম্যপূর্ণ?

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

অ্যাপটিকে ব্যবহারযোগ্য না করে ডিবাগ স্তরের লগিং সাধারণত দীর্ঘ সময়ের জন্য চালু থাকতে পারে।

লগ ইনফ্রাস্ট্রাকচারের মাধ্যমে সেই তথ্যটি কেন যেতে হবে?

এটা করতে হবে না। কিছু ফ্রেমওয়ার্কের আলাদা ট্র্যাসলগার থাকে।

সাধারণত এটি লগগুলিতে শেষ হয় যেহেতু ডিস্ক / নেটওয়ার্ক, ত্রুটি হ্যান্ডলিং, লগ রোটেশন ইত্যাদিতে লেখার ক্ষেত্রে ট্র্যাসলগার এবং সাধারণ লগারের সমান প্রয়োজন হয় since

ডিবাগারের চেয়ে লগটি কেন ব্যবহার করা ভাল?

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

তবে তারা কেবল নাম। অন্য কোনও লেবেলের মতো এগুলি কেবলমাত্র লোকদের রাখা জিনিসগুলির নাম এবং সাধারণত বিভিন্ন ব্যক্তির কাছে বিভিন্ন জিনিস বোঝায়। এবং লেবেলটি মাংসযুক্ত বিটগুলির তুলনায় লেবেলটির চেয়ে কম গুরুত্বপূর্ণ।


3
"পারফরম্যান্স" দিকটি আমাকে সত্যই বুঝতে সাহায্য করে। ধন্যবাদ!
লরেন্ট বোর্গোল্ট-রায়

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

@ andy256 - আমার অভিজ্ঞতায় ট্রেস লেভেল লগিং সেই ধরণের জিনিসকে বাধা দেয়।
টেলাস্টিন

@ টেলাস্টিন হ্যাঁ, এটি অবশ্যই সম্ভব। সিস্টেম সহনশীলতার উপর কতটা নির্ভর করে। একজন ইঞ্জিনিয়ারকে অবশ্যই উপলব্ধ সরঞ্জামগুলি বুঝতে হবে এবং কাজের জন্য সঠিক একটিটি নির্বাচন করতে হবে।
andy256

15

বিশেষ দ্রষ্টব্য রাখুন যে slf4j বিশেষভাবে ট্রেস ব্যবহারের বিরুদ্ধে প্রস্তাব দেয় ( http://slf4j.org/faq.html#trace ):

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

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

সাধারণত, আমি দেখতে পাচ্ছি যে অন্যান্য পদ্ধতির চেয়ে ট্রেস সাধারণত বেশি চেষ্টা করে effort


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

13

সাধারণভাবে ডিবাগের স্তরগুলি সম্পূর্ণ স্বেচ্ছাসেবী এবং ভাষা, গ্রন্থাগার এবং সংস্থাগুলির মধ্যে পৃথক হতে পারে।

বলা হচ্ছে, এখানে আমি তাদের ব্যবহার করতে দেখেছি:

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

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

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

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

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


9

আমি মনে করি টেলাস্টিনের দুর্দান্ত উত্তরটি আমার থাম্বের সংক্ষিপ্ত নিয়মের সংক্ষিপ্ত আকারে দেওয়া যেতে পারে:

  • DEBUG লগিং অবশ্যই উত্পাদনে ব্যবহার করতে সক্ষম হতে হবে (তবে এখনও স্বাভাবিকভাবে বন্ধ হয়ে যায়)
  • TRACE লগিংয়ের ক্ষেত্রে এমনটি অনুমোদিত যে প্রযোজনায় এটি নির্দিষ্ট (সংক্ষিপ্ত / সংক্ষিপ্ত অধিবেশন ব্যতীত) ব্যবহার অপরিহার্য

6

এখানে আমার থাম্ব নিয়ম

error   you need        to do something
warn    you might need  to do something
info    you need        to log this in production
debug   you might need  to log this in production
trace   everything that is happening (no performance concerns)

এর পিছনে অনুমান যে অপ্স দল করবে s

  • সর্বদা উত্পাদন লগ-স্তরের তথ্যে সেট থাকে set
  • প্রোডাকশনে লগ-লেভেল ডিবাগ সেট হতে পারে
  • উত্পাদন কখনও লগ-স্তর ট্রেস সেট করা আছে

এই অনুমানের সাথে সজ্জিত, আপনি কিভাবে একজন বিকাশকারী হিসাবে লগ স্তরগুলি ব্যবহার করতে পারেন তা এখানে ...

সমস্যা # 1) উত্পাদন কর্মক্ষমতা খুব বেশি কমে না

debugদ্রষ্টব্য # 1। আপনি, বিকাশকারী হিসাবে, আপনি মেশিনটি খুব ধীরে ধীরে কমিয়ে না দিয়ে প্রযোজনায় আপনার প্রয়োজনীয় তথ্যের ভারসাম্য বজায় রাখতে যথাসাধ্য চেষ্টা করছেন। আপনি বলছেন "ক্রমাগত এটিকে উত্পাদনে লগ করা ভাল ধারণা (যদি আপনি চান)"।

সমস্যা # 2) বিকাশের সময় ভার্বোজের তথ্য রয়েছে

traceসমস্যা # 2 সমাধান করে। এটির কোনও উত্পাদন মেশিনে কী প্রভাব ফেলবে তা আপনার একেবারেই উদ্বেগ নয়, কোডটি বিকাশের সময় আপনার এখনই সেই তথ্য দরকার। আপনি বলছেন "আমি কোনও প্রতিশ্রুতি দিচ্ছি না যে এই তথ্যে সর্বদা লগ ইন করা ভাল ধারণা" "


মঞ্জুর (যেমন অন্যরা বলেছেন), এই জিনিসগুলি স্বেচ্ছাসেবী; সুতরাং কেবল নিশ্চিত করুন যে আপনার বিকাশ দল (এবং অপস / মনিটরিং দল - কারণ তারা আপনার লগিংয়ের ব্যবহারকারীও রয়েছে) কোনও কিছুর সাথে সম্মত হন।


2

ট্র্যাক স্তরে লগিংয়ের একটি সাধারণ উদাহরণ কী হবে?

ENTRY / প্রস্থান একটি পদ্ধতি থেকে লগ। এই লগগুলি আপনাকে প্রোগ্রামের প্রবাহটি সনাক্ত করতে সহায়তা করে এবং যখন খুব কার্যকর হতে থাকে:

  1. প্রোগ্রামটি হঠাৎ করে ক্র্যাশ হয়ে গেছে - লগের শেষ লাইনটি দেখে এটি ঠিক বুঝতে পারে যে এটি কোন ক্রিয়াকলাপটি বিধ্বস্ত হয়েছিল

  2. কিছু দুর্বৃত্ত ফাংশন একটি ব্যতিক্রম শোষণ করে নিঃশব্দে ব্যর্থ হয়

তারা কেবল DEBUG ব্যবহার না করে একটি পৃথক ট্র্যাক স্তরের ওয়ারেন্ট দেয় কারণ আপনার কোড বেসে প্রতিটি পদ্ধতির জন্য ENTRY / EXIT লগ সক্ষম করা একটি অমিত পরিমাণে অতিরিক্ত লগ তৈরি করতে চলেছে যা এমনকি সর্বদা চালু রাখা অযৌক্তিক , এমনকি কোনও DEBUG প্রসঙ্গেও।

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