লগিং বোঝা

সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।

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

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

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 FINEST / FINER

চিত্র 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 একই লগ লেভেল স্ট্যান্ডার্ড ব্যবহার করে, @hide Slog শুধুমাত্র প্ল্যাটফর্ম দ্বারা ব্যবহারযোগ্য। EventLog স্তরগুলি /system/etc/event-log-tags tags-এ event.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) লগ করবেন না। এর মধ্যে বিশদ বিবরণ রয়েছে যেমন:

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

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

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

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