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

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

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

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

Android লগিং সিস্টেম হল সিস্টেম প্রসেস logd দ্বারা পরিচালিত স্ট্রাকচার্ড সার্কুলার বাফারের একটি সেট। উপলভ্য বাফারের সেট নির্দিষ্ট এবং সিস্টেম দ্বারা সংজ্ঞায়িত। সবচেয়ে প্রাসঙ্গিক বাফার হল:

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

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

adb logcat-এর মাধ্যমে দেখানো লগ চার লেভেলে ফিল্টার করা হয়:

কম্পাইল-টাইম ফিল্টারিং
কম্পাইলেশন সেটিংসের উপর নির্ভর করে, কিছু লগ বাইনারি থেকে সম্পূর্ণভাবে সরানো হতে পারে। যেমন, Java কোড থেকে 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" ট্যাগ সহ "তথ্য" বা তার বেশি অগ্রাধিকারের লগ মেসেজ এবং "MyApp" ট্যাগ সহ "ডিবাগ" বা তার বেশি অগ্রাধিকারের লগ মেসেজ ছাড়া অন্য সব লগ মেসেজকে সাপ্রেস করে:

    adb logcat ActivityManager:I MyApp:D *:S
    

    আগের এক্সপ্রেশনের শেষ এলিমেন্ট, *:S, সব ট্যাগের জন্য অগ্রাধিকার লেভেল "silent" হিসেবে সেট করে, যা নিশ্চিত করে যে শুধুমাত্র "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: মেসেজ ইস্যু করা প্রসেসের অগ্রাধিকার, ট্যাগ ও PID দেখায়।
    • long: সব মেটাডেটা ফিল্ড দেখায় এবং ফাঁকা লাইন দিয়ে মেসেজ আলাদা করে।
    • process: শুধু PID দেখায়।
    • raw: অন্য কোনও মেটাডেটা ফিল্ড ছাড়াই র' লগ মেসেজ দেখায়।
    • tag: শুধু অগ্রাধিকার ও ট্যাগ দেখায়।
    • thread: একটি লিগ্যাসি ফর্ম্যাট যা মেসেজ ইস্যু করা থ্রেডের অগ্রাধিকার, PID এবং TID দেখায়।
    • threadtime (ডিফল্ট): মেসেজ ইস্যু করা থ্রেডের তারিখ, ইনভোকেশন টাইম, অগ্রাধিকার, ট্যাগ, PID ও TID দেখায়।
    • time: মেসেজ ইস্যু করার প্রসেসের তারিখ, ইনভোকেশন টাইম, অগ্রাধিকার, ট্যাগ ও PID দেখায়।

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

    [adb] logcat [-v <format>]
    

    thread আউটপুট ফর্ম্যাটে কীভাবে মেসেজ জেনারেট করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল:

    adb logcat -v thread
    

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

    ফর্ম্যাট মডিফায়ার

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

    adb logcat -b all -v color -d
    

    প্রতিটি Android লগ মেসেজের সাথে একটি ট্যাগ ও প্রায়োরিটি যুক্ত থাকে। আপনি যেকোনও ফর্ম্যাট মডিফায়ারকে নিম্নলিখিত ফর্ম্যাট বিকল্পগুলির যেকোনও একটির সাথে একত্রিত করতে পারেন:

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

    নিম্নলিখিত মডিফায়ার বিবরণ ফর্ম্যাট করতে, কমান্ড লাইনে logcat -v --help লিখুন:

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

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

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

    • 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 টুলে দেখা যায়। সাধারণ লগ-ইন করার পদ্ধতির মধ্যে রয়েছে:

    যেমন, নিম্নলিখিত কল ব্যবহার করে:

    Kotlin

    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