Logcat কমান্ড লাইন টুল

Logcat হল একটি কমান্ড-লাইন টুল যা Log ক্লাসের সাথে আপনার অ্যাপ থেকে লেখা বার্তাগুলি সহ সিস্টেম বার্তাগুলির একটি লগ ডাম্প করে৷

এই পৃষ্ঠাটি কমান্ড-লাইন logcat টুল সম্পর্কে, কিন্তু আপনি Android স্টুডিওতে Logcat উইন্ডো থেকে লগ বার্তা দেখতে পারেন। অ্যান্ড্রয়েড স্টুডিও থেকে লগগুলি দেখা এবং ফিল্টার করার বিষয়ে তথ্যের জন্য, লগক্যাট দিয়ে লগগুলি দেখুন এবং লিখুন দেখুন।

লগিং সিস্টেম ওভারভিউ

অ্যান্ড্রয়েড লগিং সিস্টেম হল সিস্টেম প্রসেস logd দ্বারা রক্ষণাবেক্ষণ করা কাঠামোবদ্ধ বৃত্তাকার বাফারগুলির একটি সেট। উপলব্ধ বাফারের সেট সিস্টেম দ্বারা স্থির এবং সংজ্ঞায়িত করা হয়। সবচেয়ে প্রাসঙ্গিক বাফার হল:

  • main : বেশিরভাগ অ্যাপ্লিকেশন লগ সংরক্ষণ করে।
  • system : Android OS থেকে উদ্ভূত বার্তা সংরক্ষণ করে।
  • crash : ক্র্যাশ লগ স্টোর করে। প্রতিটি লগ এন্ট্রির একটি অগ্রাধিকার থাকে, একটি ট্যাগ যা লগের উৎপত্তি এবং প্রকৃত লগ বার্তা সনাক্ত করে।

লগিং সিস্টেমের প্রাথমিক C/C++ ইন্টারফেস হল শেয়ার্ড লাইব্রেরি liblog এবং এর হেডার <android/log.h> । সমস্ত ভাষা-নির্দিষ্ট লগিং সুবিধা ( android.util.Log সহ) অবশেষে ফাংশনটিকে কল করে __android_log_write । ডিফল্টরূপে, এটি ফাংশনটিকে কল করে __android_log_logd_logger , যা একটি সকেট ব্যবহার করে logd এন্ট্রি পাঠায়। API স্তর 30 দিয়ে শুরু করে, লগিং ফাংশনটি __android_set_log_writer কল করে পরিবর্তন করা যেতে পারে। NDK ডকুমেন্টেশনে আরও তথ্য পাওয়া যায়।

adb logcat দ্বারা প্রদর্শিত লগগুলি ফিল্টারিংয়ের চারটি স্তরের মধ্য দিয়ে যায়:

কম্পাইল-টাইম ফিল্টারিং
কম্পাইলেশন সেটিংসের উপর নির্ভর করে, কিছু লগ সম্পূর্ণরূপে বাইনারি থেকে মুছে ফেলা হতে পারে। উদাহরণস্বরূপ, জাভা কোড থেকে Log.d এ কলগুলি সরাতে ProGuard কনফিগার করা যেতে পারে।
সিস্টেম সম্পত্তি ফিল্টারিং
liblog logd এ পাঠানোর সর্বনিম্ন তীব্রতা স্তর নির্ধারণ করতে সিস্টেম বৈশিষ্ট্যগুলির একটি সেট জিজ্ঞাসা করে। যদি আপনার লগগুলিতে MyApp ট্যাগ থাকে তবে নিম্নলিখিত বৈশিষ্ট্যগুলি পরীক্ষা করা হয়েছে এবং ন্যূনতম তীব্রতার প্রথম অক্ষর ( V , D , I , W , E , বা S সমস্ত লগ নিষ্ক্রিয় করার জন্য) ধারণ করা হবে বলে আশা করা হচ্ছে:
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
অ্যাপ্লিকেশন ফিল্টারিং
যদি কোনো বৈশিষ্ট্য সেট করা না থাকে, liblog __android_log_set_minimum_priority দ্বারা সেট করা ন্যূনতম অগ্রাধিকার ব্যবহার করে। ডিফল্ট সেটিং হল INFO
প্রদর্শন ফিল্টারিং
adb logcat অতিরিক্ত ফিল্টার সমর্থন করে যা logd থেকে দেখানো লগের পরিমাণ কমাতে পারে। আরও বিশদ বিবরণের জন্য লগ আউটপুট ফিল্টারিং সম্পর্কে বিভাগটি দেখুন।

কমান্ড লাইন সিনট্যাক্স

adb শেলের মাধ্যমে logcat চালানোর জন্য, সাধারণ ব্যবহার হল:

[adb] shell logcat [<option>] ... [<filter-spec>] ...

এছাড়াও adb logcat এর একটি সংক্ষিপ্ত বিবরণ রয়েছে, কিন্তু এটি শুধুমাত্র adb shell logcat এ প্রসারিত হয়।

অপশন

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

    adb logcat --help
    

মনে রাখবেন যে logcat যেহেতু OS ডেভেলপারদের পাশাপাশি অ্যাপ ডেভেলপারদের জন্য একটি টুল (অ্যাপ ডেভেলপারদের পরিবর্তে Android Studio ব্যবহার করার প্রত্যাশিত) অনেকগুলি বিকল্প শুধুমাত্র root হিসাবে ব্যবহারযোগ্য।

ফিল্টার লগ আউটপুট

একটি লগ বার্তার ট্যাগ হল একটি ছোট স্ট্রিং যা সিস্টেমের উপাদানটি নির্দেশ করে যেখানে বার্তাটি উদ্ভূত হয়। উদাহরণস্বরূপ, ভিউ সিস্টেমের জন্য "ভিউ"।

অগ্রাধিকার হল নিম্নোক্ত অক্ষর মানগুলির মধ্যে একটি, সর্বনিম্ন থেকে সর্বোচ্চ অগ্রাধিকার পর্যন্ত অর্ডার করা হয়েছে:

    • V : ভার্বোস (সর্বনিম্ন অগ্রাধিকার)
    • D : ডিবাগ
    • I : তথ্য
    • W : সতর্কতা
    • E : ত্রুটি
    • F : মারাত্মক
    • S : নীরব (সর্বোচ্চ অগ্রাধিকার, যেখানে কিছুই মুদ্রিত হয় না)
  • অগ্রাধিকার সহ সিস্টেমে ব্যবহৃত ট্যাগগুলির একটি তালিকা পেতে, logcat চালান এবং <priority>/<tag> হিসাবে দেওয়া প্রতিটি বার্তার প্রথম দুটি কলাম পর্যবেক্ষণ করুন।

    নিম্নে logcat -v brief output কমান্ডের মাধ্যমে প্রাপ্ত সংক্ষিপ্ত logcat আউটপুটের একটি উদাহরণ। আউটপুট দেখায় যে বার্তাটি অগ্রাধিকার স্তর "I" এবং ট্যাগ "ActivityManager" এর সাথে সম্পর্কিত:

    I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}
    

    একটি পরিচালনাযোগ্য স্তরে লগ আউটপুট কমাতে, ফিল্টার এক্সপ্রেশন ব্যবহার করে লগ আউটপুট সীমাবদ্ধ করুন। ফিল্টার এক্সপ্রেশনগুলি আপনাকে সিস্টেমে ট্যাগ-অগ্রাধিকার সমন্বয়গুলি নির্দেশ করতে দেয় যা আপনি আগ্রহী। সিস্টেমটি নির্দিষ্ট ট্যাগের জন্য অন্যান্য বার্তাগুলিকে দমন করে।

    একটি ফিল্টার এক্সপ্রেশন এই ফরম্যাট tag:priority ... অনুসরণ করে, যেখানে tag আগ্রহের ট্যাগ নির্দেশ করে এবং priority সেই ট্যাগের জন্য রিপোর্ট করার জন্য অগ্রাধিকারের ন্যূনতম স্তর নির্দেশ করে। নির্দিষ্ট অগ্রাধিকারে বা উপরে সেই ট্যাগের জন্য বার্তাগুলি লগে লেখা হয়। একটি একক ফিল্টার এক্সপ্রেশনে যেকোন সংখ্যক tag:priority স্পেসিফিকেশন সরবরাহ করুন। স্পেসিফিকেশনের সিরিজ হোয়াইটস্পেস-ডিলিমিটেড।

    নিম্নলিখিতটি একটি ফিল্টার এক্সপ্রেশনের একটি উদাহরণ যা অগ্রাধিকার "তথ্য" বা তার উপরে "ActivityManager" ট্যাগযুক্ত এবং অগ্রাধিকার "Debug" বা তার উপরে "MyApp" ট্যাগ সহ সমস্ত লগ বার্তাকে দমন করে:

    adb logcat ActivityManager:I MyApp:D *:S
    

    পূর্ববর্তী অভিব্যক্তির চূড়ান্ত উপাদান, *:S , সমস্ত ট্যাগের জন্য অগ্রাধিকার স্তরকে "সাইলেন্ট" এ সেট করে, যা নিশ্চিত করে যে শুধুমাত্র "ActivityManager" এবং "MyApp" সহ লগ বার্তাগুলি প্রদর্শিত হবে৷ *:S ব্যবহার করে নিশ্চিত করে যে লগ আউটপুট আপনার স্পষ্টভাবে নির্দিষ্ট করা ফিল্টারগুলিতে সীমাবদ্ধ। *:S আপনার ফিল্টারগুলিকে লগ আউটপুটের জন্য অনুমোদিত তালিকা হিসাবে পরিবেশন করতে দেয়।

    দ্রষ্টব্য: কিছু শেলে, " * " অক্ষরটি শেল দ্বারা সংরক্ষিত থাকে। আপনি যদি এই ধরনের শেল ব্যবহার করেন, তাহলে ফিল্টার এক্সপ্রেশনটি উদ্ধৃতিতে সংযুক্ত করুন: adb logcat "ActivityManager:I MyApp:D *:S"

    নিম্নলিখিত ফিল্টার এক্সপ্রেশনটি সমস্ত লগ বার্তাগুলিকে অগ্রাধিকার স্তরের "সতর্কতা" সহ এবং সমস্ত ট্যাগে উচ্চতর প্রদর্শন করে:

    adb logcat *:W
    

    আপনি যদি দূরবর্তী adb শেলের পরিবর্তে আপনার ডেভেলপমেন্ট কম্পিউটার থেকে logcat চালান, তাহলে আপনি পরিবেশ পরিবর্তনশীল ANDROID_LOG_TAGS এর জন্য একটি মান রপ্তানি করে একটি ডিফল্ট ফিল্টার এক্সপ্রেশনও সেট করতে পারেন:

    export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
    

    আপনি যদি দূরবর্তী শেল থেকে logcat চালান বা adb shell logcat ব্যবহার করেন তাহলে ANDROID_LOG_TAGS ফিল্টারটি এমুলেটর/ডিভাইস ইনস্ট্যান্সে রপ্তানি করা হয় না।

    নিয়ন্ত্রণ লগ আউটপুট বিন্যাস

    লগ বার্তাগুলিতে ট্যাগ এবং অগ্রাধিকার ছাড়াও অনেকগুলি মেটাডেটা ক্ষেত্র থাকে৷ আপনি বার্তাগুলির জন্য আউটপুট বিন্যাস পরিবর্তন করতে পারেন যাতে তারা একটি নির্দিষ্ট মেটাডেটা ক্ষেত্র প্রদর্শন করে। এটি করতে, -v বিকল্পটি ব্যবহার করুন এবং নিম্নলিখিত সমর্থিত আউটপুট বিন্যাসগুলির মধ্যে একটি নির্দিষ্ট করুন:

    • brief : বার্তা প্রদানের প্রক্রিয়ার অগ্রাধিকার, ট্যাগ এবং পিআইডি প্রদর্শন করে।
    • long : সমস্ত মেটাডেটা ক্ষেত্র এবং ফাঁকা লাইন সহ পৃথক বার্তা প্রদর্শন করে।
    • process : শুধুমাত্র PID প্রদর্শন করে।
    • raw : অন্য কোন মেটাডেটা ক্ষেত্র ছাড়া কাঁচা লগ বার্তা প্রদর্শন করে।
    • tag : শুধুমাত্র অগ্রাধিকার এবং ট্যাগ প্রদর্শন করে।
    • thread: একটি উত্তরাধিকার বিন্যাস যা বার্তা প্রদানকারী থ্রেডের অগ্রাধিকার, PID এবং TID দেখায়।
    • threadtime (ডিফল্ট): বার্তা প্রদানকারী থ্রেডের তারিখ, আহ্বানের সময়, অগ্রাধিকার, ট্যাগ, পিআইডি এবং টিআইডি প্রদর্শন করে।
    • time : তারিখ, আহ্বানের সময়, অগ্রাধিকার, ট্যাগ এবং বার্তা প্রদানের প্রক্রিয়ার পিআইডি প্রদর্শন করে।

    logcat শুরু করার সময়, -v বিকল্পটি ব্যবহার করে আপনি যে আউটপুট বিন্যাসটি চান তা নির্দিষ্ট করুন:

    [adb] logcat [-v <format>]
    

    এখানে একটি উদাহরণ যা দেখায় কিভাবে thread আউটপুট বিন্যাসে বার্তা তৈরি করতে হয়:

    adb logcat -v thread
    

    আপনি -v বিকল্পের সাথে শুধুমাত্র একটি আউটপুট বিন্যাস নির্দিষ্ট করতে পারেন। যাইহোক, আপনি যতগুলি প্রয়োজন ততগুলি সংশোধক নির্দিষ্ট করতে পারেন, যদি সেগুলি বোঝা যায়। logcat সংশোধকদের উপেক্ষা করে যা অর্থহীন।

    বিন্যাস সংশোধক

    বিন্যাস সংশোধক logcat আউটপুট পরিবর্তন. একটি বিন্যাস সংশোধক নির্দিষ্ট করতে, -v বিকল্পটি ব্যবহার করুন, নিম্নরূপ:

    adb logcat -b all -v color -d
    

    প্রতিটি অ্যান্ড্রয়েড লগ বার্তার সাথে একটি ট্যাগ এবং একটি অগ্রাধিকার যুক্ত থাকে৷ আপনি নিম্নলিখিত ফর্ম্যাট বিকল্পগুলির যে কোনও একটির সাথে যে কোনও বিন্যাস পরিবর্তনকারীকে একত্রিত করতে পারেন:

    • brief
    • long
    • process
    • raw
    • tag
    • thread
    • threadtime
    • time

    নিম্নলিখিত সংশোধক বিবরণ বিন্যাস করতে, কমান্ড লাইনে logcat -v --help লিখুন:

    • color : প্রতিটি অগ্রাধিকার স্তরকে একটি ভিন্ন রঙের সাথে দেখায়।
    • descriptive : লগ বাফার ইভেন্টের বিবরণ দেখায়। এই সংশোধকটি শুধুমাত্র ইভেন্ট লগ বাফার বার্তাগুলিকে প্রভাবিত করে এবং অন্যান্য নন-বাইনারী বাফারগুলিতে এর কোন প্রভাব নেই৷ ইভেন্টের বিবরণ ইভেন্ট-লগ-ট্যাগ ডাটাবেস থেকে আসে।
    • epoch : 1 জানুয়ারী, 1970 থেকে শুরু করে সেকেন্ডে সময় দেখায়।
    • monotonic : শেষ বুট থেকে শুরু করে CPU সেকেন্ডে সময় প্রদর্শন করে।
    • printable : নিশ্চিত করে যে কোনো বাইনারি লগিং বিষয়বস্তু পালিয়ে গেছে।
    • uid : অ্যাক্সেস নিয়ন্ত্রণ দ্বারা অনুমোদিত হলে, লগ করা প্রক্রিয়াটির UID বা Android ID প্রদর্শন করে।
    • usec : মাইক্রোসেকেন্ডে নির্ভুলতার সাথে সময় প্রদর্শন করে।
    • UTC : সময়কে UTC হিসাবে দেখায়।
    • year : প্রদর্শিত সময়ের সাথে বছর যোগ করে।
    • zone : প্রদর্শিত সময়ে স্থানীয় সময় অঞ্চল যোগ করে।

    বিকল্প লগ বাফার দেখুন

    অ্যান্ড্রয়েড লগিং সিস্টেম লগ বার্তাগুলির জন্য একাধিক বৃত্তাকার বাফার রাখে এবং সমস্ত লগ বার্তা ডিফল্ট সার্কুলার বাফারে পাঠানো হয় না। অতিরিক্ত লগ বার্তা দেখতে, একটি বিকল্প বৃত্তাকার বাফার দেখার অনুরোধ করতে -b বিকল্পের সাথে logcat কমান্ডটি চালান। আপনি এই বিকল্প বাফারগুলির যেকোনো একটি দেখতে পারেন:

    • radio : রেডিও/টেলিফোনি সম্পর্কিত বার্তা ধারণ করে এমন বাফার দেখায়।
    • events : ব্যাখ্যা করা বাইনারি সিস্টেম ইভেন্ট বাফার বার্তাগুলি দেখায়৷
    • main : প্রধান লগ বাফার (ডিফল্ট) দেখায়, যাতে সিস্টেম এবং ক্র্যাশ লগ বার্তা থাকে না।
    • system : সিস্টেম লগ বাফার দেখায় (ডিফল্ট)।
    • crash : ক্র্যাশ লগ বাফার দেখায় (ডিফল্ট)।
    • all : সমস্ত বাফার দেখায়।
    • default : রিপোর্ট main , system , এবং crash বাফার।

    -b বিকল্পের ব্যবহার হল:

    [adb] logcat [-b <buffer>]
    

    রেডিও এবং টেলিফোনি বার্তা সম্বলিত একটি লগ বাফার কীভাবে দেখতে হয় তার একটি উদাহরণ এখানে রয়েছে:

    adb logcat -b radio
    

    আপনি যে সমস্ত বাফারগুলি মুদ্রণ করতে চান তার জন্য একাধিক -b পতাকা নির্দিষ্ট করতে, নিম্নলিখিতটি লিখুন:

    logcat -b main -b radio -b events
    

    বাফারগুলির একটি কমা-বিচ্ছিন্ন তালিকা সহ একটি একক -b পতাকা নির্দিষ্ট করুন, উদাহরণস্বরূপ:

    logcat -b main,radio,events
    

    কোড থেকে লগ

    Log ক্লাস আপনাকে আপনার কোডে লগ এন্ট্রি তৈরি করতে দেয় যা logcat টুলে প্রদর্শিত হয়। সাধারণ লগিং পদ্ধতি অন্তর্ভুক্ত:

    উদাহরণস্বরূপ, নিম্নলিখিত কল ব্যবহার করে:

    কোটলিন

    Log.i("MyActivity", "MyClass.getView() — get item number $position")
    

    জাভা

    Log.i("MyActivity", "MyClass.getView() — get item number " + position);
    

    logcat নিম্নলিখিত অনুরূপ কিছু আউটপুট:

    I/MyActivity( 1557): MyClass.getView() — get item number 1