লগিং বোঝো

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

লগ মান

logcat এ ব্যবহৃত বিভিন্ন স্ট্যান্ডার্ডের মিশ্রণের কারণে অ্যান্ড্রয়েডে লগিং করা জটিল। ব্যবহৃত প্রধান স্ট্যান্ডার্ডগুলো নিচে বিস্তারিতভাবে বর্ণনা করা হলো:

উৎস উদাহরণ স্ট্যাক স্তরের নির্দেশিকা
RFC 5424 ( syslog স্ট্যান্ডার্ড) লিনাক্স কার্নেল, অনেক ইউনিক্স অ্যাপ কার্নেল, সিস্টেম ডেমন
android.util.Log অ্যান্ড্রয়েড ফ্রেমওয়ার্ক + অ্যাপ লগিং অ্যান্ড্রয়েড ফ্রেমওয়ার্ক এবং সিস্টেম অ্যাপ
java.util.logging.Level জাভাতে সাধারণ লগিং নন-সিস্টেম অ্যাপ

চিত্র ১: লগ লেভেল মানদণ্ড।

যদিও এই প্রতিটি স্ট্যান্ডার্ডের স্তর কাঠামো একই রকম, তবে এদের সূক্ষ্মতার মধ্যে পার্থক্য রয়েছে। স্ট্যান্ডার্ডগুলো জুড়ে আনুমানিক সমতুল্যগুলো নিম্নরূপ:

আরএফসি ৫৪২৪ স্তর RFC 5424 তীব্রতা আরএফসি ৫৪২৪ বর্ণনা android.util.Log java.util.logging.Level
জরুরি অবস্থা সিস্টেমটি ব্যবহারযোগ্য নয় Log.e / Log.wtf SEVERE
সতর্কতা অবিলম্বে ব্যবস্থা গ্রহণ করতে হবে। Log.e / Log.wtf SEVERE
সমালোচনামূলক গুরুতর অবস্থা Log.e / Log.wtf SEVERE
ত্রুটি ত্রুটির অবস্থা Log.e SEVERE
সতর্কতা সতর্কতামূলক শর্তাবলী Log.w WARNING
বিজ্ঞপ্তি স্বাভাবিক কিন্তু তাৎপর্যপূর্ণ Log.w WARNING
তথ্য তথ্য বার্তা Log.i INFO
ডিবাগ ডিবাগ-স্তরের বার্তা Log.d CONFIG , FINE
- - বিশদ বার্তা Log.v FINER / FINEST

চিত্র ২: syslog , Android, এবং Java লগিং লেভেল।

লগ স্তরের নির্দেশিকা

প্রতিটি লগ স্ট্যান্ডার্ডের জন্য নির্দিষ্ট নির্দেশিকা রয়েছে। ব্যবহৃত উপযুক্ত স্ট্যান্ডার্ড অনুযায়ী লগ লেভেল নির্বাচন করা হয়, যেমন কার্নেল ডেভেলপমেন্টের জন্য syslog স্ট্যান্ডার্ড ব্যবহার করা।

লগ লেভেলের ক্রম, সর্বনিম্ন থেকে সর্বোচ্চ পর্যন্ত, নিচের তিনটি চিত্রে দেখানো হয়েছে:

ERROR এই লগগুলো সবসময় রাখা হয়।
WARN এই লগগুলো সবসময় রাখা হয়।
INFO এই লগগুলো সবসময় রাখা হয়।
DEBUG এই লগগুলো কম্পাইল করা হলেও রানটাইমে কিছু অংশ বাদ দেওয়া হয়।
VERBOSE ডেভেলপমেন্ট পর্যায় ছাড়া এই লগগুলো কখনোই কোনো অ্যাপে সংকলিত হয় না।

চিত্র ৩: android.util.Log

CONFIG স্থির কনফিগারেশন বার্তাগুলির জন্য বার্তা স্তর
FINE ট্রেসিং তথ্য প্রদানকারী বার্তা স্তর
FINER একটি বেশ বিস্তারিত ট্রেসিং বার্তা নির্দেশ করে
FINEST একটি অত্যন্ত বিশদ ট্রেসিং বার্তা নির্দেশ করে
INFO তথ্যমূলক বার্তার জন্য বার্তার স্তর
SEVERE গুরুতর ব্যর্থতা নির্দেশকারী বার্তার স্তর
WARNING বার্তার স্তর একটি সম্ভাব্য সমস্যা নির্দেশ করছে

চিত্র ৪: java.util.Logging.Level .

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

চিত্র ৫: RFC 5424 - ধারা ৬.২.১

অ্যাপ লগিং

নিচে দেখানো অনুযায়ী, android.util.Log ক্লাসের Log#isLoggable ব্যবহার করে TAG এর মাধ্যমে নির্দিষ্ট লগিং করা হয়:

if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) {
 Log.v("FOO_TAG", "Message for logging.");
}

নিচে দেখানো অনুযায়ী, রানটাইমে লগিং-এর একটি নির্দিষ্ট স্তর সমন্বয় করা যেতে পারে:

adb shell setprop log.tag.FOO_TAG VERBOSE

রিবুট করলে log.tag.* প্রোপার্টিগুলো রিসেট হয়ে যায়। কিছু স্থায়ী ভ্যারিয়েন্টও রয়েছে যা রিবুটের পরেও থেকে যায়। নিচে দেখুন:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

Log#isLoggable চেকগুলো অ্যাপ কোডে লগ ট্রেস রেখে যায়। বুলিয়ান DEBUG ফ্ল্যাগগুলো কম্পাইলার অপটিমাইজেশনকে false এ সেট করে লগ ট্রেস বাইপাস করে, যেমনটি নিচে দেখানো হয়েছে:

private final static boolean DEBUG = false;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

R8 দ্বারা কম্পাইল করার সময় ProGuard রুলসেটের মাধ্যমে প্রতিটি APK-এর জন্য আলাদাভাবে লগিং মুছে ফেলা যায়। নিচের উদাহরণটি android.util.Log এর জন্য INFO লেভেলের নিচের সমস্ত লগিং মুছে ফেলে:

# This allows proguard to strip isLoggable() blocks containing only <=INFO log
# code from release builds.
-assumenosideeffects class android.util.Log {
  static *** i(...);
  static *** d(...);
  static *** v(...);
  static *** isLoggable(...);
}
-maximumremovedandroidloglevel 4

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

অ্যান্ড্রয়েড রানটাইম (ART)-এ সিস্টেম লগিং

সিস্টেম অ্যাপ এবং পরিষেবাগুলির জন্য বেশ কয়েকটি ক্লাস উপলব্ধ রয়েছে:

শ্রেণী উদ্দেশ্য
android.telephony.Rlog রেডিও লগিং
android.util.Log সাধারণ অ্যাপ লগিং
android.util.EventLog সিস্টেম ইন্টিগ্রেটর ডায়াগনস্টিক ইভেন্ট লগিং
android.util.Slog প্ল্যাটফর্ম ফ্রেমওয়ার্ক লগিং

চিত্র ৬: উপলব্ধ সিস্টেম লগ শ্রেণি এবং উদ্দেশ্যসমূহ।

যদিও android.util.Log এবং android.util.Slog একই লগ লেভেল স্ট্যান্ডার্ড ব্যবহার করে, Slog হলো একটি @hide ক্লাস যা শুধুমাত্র প্ল্যাটফর্ম দ্বারা ব্যবহারযোগ্য। EventLog লেভেলগুলো /system/etc/event-log-tags এ থাকা event.logtags ফাইলের এন্ট্রিগুলোর সাথে ম্যাপ করা থাকে।

নেটিভ লগিং

C/C++ এ লগিং syslog স্ট্যান্ডার্ড অনুসরণ করে, যেখানে syslog (2) হলো Linux কার্নেল syslog যা printk বাফার নিয়ন্ত্রণ করে, এবং syslog (3) হলো সাধারণ সিস্টেম লগার। Android সাধারণ সিস্টেম লগিংয়ের জন্য liblog লাইব্রেরি ব্যবহার করে।

liblog নিম্নলিখিত ম্যাক্রো ফর্ম ব্যবহার করে সাবলগ গ্রুপগুলির জন্য র‍্যাপার সরবরাহ করে:

[Sublog Buffer ID] LOG [Log Level ID]

উদাহরণস্বরূপ, RLOGD হলো [Radio log buffer ID] LOG [Debug Level] । প্রধান liblog র‍্যাপারগুলো হলো নিম্নরূপ:

মোড়ক শ্রেণী উদাহরণ ফাংশন
log_main.h ALOGV , ALOGW
log_radio.h RLOGD , RLOGE
log_system.h SLOGI , SLOGW

চিত্র ৭: liblog র‍্যাপারসমূহ।

অ্যান্ড্রয়েডে লগিংয়ের জন্য উচ্চতর ইন্টারফেস রয়েছে যা সরাসরি liblog ব্যবহারের চেয়ে বেশি পছন্দনীয়, যেমনটি নিচে দেখা যাচ্ছে:

লাইব্রেরি ব্যবহার
async_safe শুধুমাত্র অ্যাসিঙ্ক-সিগন্যাল-সেফ পরিবেশ থেকে লগিং করার জন্য লাইব্রেরি।
libbase এটি একটি লগিং লাইব্রেরি যা লগিংয়ের জন্য একটি C++ স্ট্রিম ইন্টারফেস প্রদান করে, যা গুগল-স্টাইল (glog) লগিংয়ের অনুরূপ। libbase বাহ্যিক প্রজেক্টে ব্যবহারযোগ্য এবং libbase_ndk ব্যবহারকারী অ্যাপগুলোতেও উপলব্ধ।

চিত্র ৮: উচ্চ স্তরের লগ লাইব্রেরিসমূহ।

মাল্টিস্ট্যাক আনুমানিকতা

সূক্ষ্মতা এবং স্তরের উদ্দেশ্যের ভিন্নতার কারণে, বিভিন্ন লগিং স্ট্যান্ডার্ডের মধ্যে কোনো স্পষ্ট বা হুবহু মিল নেই। উদাহরণস্বরূপ, এরর লগের জন্য java.util.logging.Level এবং android.util.Log লেভেলগুলো হুবহু এক নয়:

java.util.Logging.Level android.util.Log
গুরুতর Log.wtf
গুরুতর Log.e

চিত্র ৯: সাধারণ জাভা লগিং বনাম অ্যান্ড্রয়েড লগিং-এ ত্রুটির মাত্রা।

এই ধরনের ক্ষেত্রে, কোন স্তরটি প্রয়োগ করতে হবে তা নির্ধারণ করতে স্বতন্ত্র মানদণ্ড ব্যবহার করুন।

একাধিক স্ট্যাক লেভেল কম্পোনেন্ট সহ সিস্টেম ডেভেলপমেন্টের সময়, প্রতি-কম্পোনেন্টের জন্য কোন স্ট্যান্ডার্ড ব্যবহার করতে হবে তা নির্ধারণ করতে চিত্র ১ অনুসরণ করুন। টিয়ার মেসেজিং-এর একটি আনুমানিক নির্দেশিকার জন্য চিত্র ২ অনুসরণ করুন।

নিরাপত্তা এবং গোপনীয়তা

ব্যক্তিগতভাবে শনাক্তযোগ্য তথ্য (PII) নথিভুক্ত করবেন না। এর মধ্যে নিম্নলিখিত বিবরণ অন্তর্ভুক্ত:

  • ইমেল ঠিকানা
  • টেলিফোন নম্বর
  • নাম

একইভাবে, কিছু বিবরণ স্পষ্টভাবে ব্যক্তিগতভাবে শনাক্তযোগ্য না হলেও সংবেদনশীল বলে বিবেচিত হয়।

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

প্রকাশের পূর্বে নিরাপত্তা ও গোপনীয়তা পর্যালোচনার অংশ হিসেবে লগ নীতি এবং গ্রহণযোগ্য বিবরণ অবশ্যই সম্পন্ন করতে হবে।

ডিভাইস লগ

android.permission.READ_LOGS ব্যবহার সহ ডিভাইসের সমস্ত লগে প্রবেশাধিকার সীমাবদ্ধ:

  • যদি ব্যাকগ্রাউন্ডে থাকা কোনো অ্যাপ ডিভাইসের সমস্ত লগ অ্যাক্সেস করার জন্য অনুরোধ করে, তবে সেই অনুরোধটি স্বয়ংক্রিয়ভাবে প্রত্যাখ্যান করা হয়, যদি না অ্যাপটি:
    • সিস্টেম UID শেয়ার করে।
    • একটি নেটিভ সিস্টেম প্রসেস ব্যবহার করে ( UID < APP_UID )।
    • DropBoxManager ব্যবহার করে।
    • শুধুমাত্র ইভেন্ট লগ বাফার অ্যাক্সেস করে।
    • EventLog এপিআই ব্যবহার করে।
    • যন্ত্রনির্ভর পরীক্ষা ব্যবহার করে।
  • ফোরগ্রাউন্ডে থাকা READ_LOGS অনুমতিযুক্ত কোনো অ্যাপ যদি ডিভাইস লগ অ্যাক্সেস করার অনুরোধ করে, তাহলে সিস্টেম ব্যবহারকারীকে সেই অ্যাক্সেস অনুরোধটি অনুমোদন বা প্রত্যাখ্যান করার জন্য জিজ্ঞাসা করে।