লগিং বোঝা

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

লগ স্ট্যান্ডার্ড

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

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

চিত্র 1: লগ স্তরের মান।

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

RFC 5424 স্তর RFC 5424 তীব্রতা RFC 5424 বর্ণনা android.util.Log java.util.logging.Level
0 জরুরী অবস্থা সিস্টেম ব্যবহার অনুপযোগী Log.e / Log.wtf SEVERE
1 সতর্কতা অবিলম্বে ব্যবস্থা নিতে হবে Log.e / Log.wtf SEVERE
2 সমালোচনামূলক জটিল অবস্থা Log.e / Log.wtf SEVERE
3 ত্রুটি ত্রুটি শর্ত Log.e SEVERE
4 সতর্কতা সতর্কতা শর্তাবলী Log.w WARNING
5 লক্ষ্য করুন স্বাভাবিক কিন্তু তাৎপর্যপূর্ণ Log.w WARNING
6 তথ্য তথ্য বার্তা Log.i INFO
7 ডিবাগ ডিবাগ-স্তরের বার্তা Log.d CONFIG , FINE
- - ভার্বোস মেসেজিং Log.v FINER / FINEST

চিত্র 2: syslog , Android, এবং Java লগিং স্তর।

লগ লেভেল নির্দেশিকা

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

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

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

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

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

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

0 জরুরী অবস্থা সিস্টেম ব্যবহার অনুপযোগী
1 সতর্কতা অবিলম্বে ব্যবস্থা নিতে হবে
2 সমালোচনামূলক জটিল অবস্থা
3 ত্রুটি ত্রুটি শর্ত
4 সতর্কতা সতর্কতা শর্তাবলী
5 লক্ষ্য করুন স্বাভাবিক কিন্তু উল্লেখযোগ্য অবস্থা
6 তথ্যমূলক তথ্যমূলক বার্তা
7 ডিবাগ ডিবাগ-স্তরের বার্তা

চিত্র 5: RFC 5424 - বিভাগ 6.2.1

অ্যাপ্লিকেশন লগিং

নীচে দেখানো হিসাবে Log#isLoggable ব্যবহার করে android.util.Log ক্লাস দ্বারা 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

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

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

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

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

চিত্র 6: উপলব্ধ সিস্টেম লগ ক্লাস এবং উদ্দেশ্য।

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

নেটিভ লগিং

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

liblog নিম্নলিখিত ম্যাক্রো ফর্ম ব্যবহার করে সাবলগ গোষ্ঠীগুলির জন্য মোড়ক প্রদান করে:

[Sublog Buffer ID] LOG [Log Level ID]

RLOGD , উদাহরণস্বরূপ, [Radio log buffer ID] LOG [Debug Level] এর সাথে মিলে যায়। প্রধান liblog wrappers নিম্নরূপ:

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

চিত্র 7: liblog wrappers.

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

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

চিত্র 8: উচ্চ স্তরের লগ লাইব্রেরি।

মাল্টিস্ট্যাক অনুমান

গ্রানুলারিটি এবং স্তরের অভিপ্রায়ের পার্থক্যের কারণে, বিভিন্ন লগিং মানগুলির কোনও স্পষ্ট বা সঠিক মিল নেই৷ উদাহরণস্বরূপ, ত্রুটি লগের জন্য java.util.logging.Level এবং android.util.Log স্তরগুলি 1:1 মিল নয়:

java.util.লগিং.লেভেল android.util.Log
গুরুতর Log.wtf
গুরুতর Log.e

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

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

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

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

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

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

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

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

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

ডিভাইস লগ

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

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