এই নিবন্ধটি লগ করার প্রক্রিয়া কভার করে, লগ স্ট্যান্ডার্ড, লেভেল নির্দেশিকা, ক্লাস, উদ্দেশ্য এবং মাল্টিস্ট্যাক আনুমানিকতা সহ।
লগ মান
 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; | 
|---|
 কম্পাইল সময়ে 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-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) লগ করবেন না। এর মধ্যে রয়েছে যেমন বিশদ বিবরণ:
- ইমেল ঠিকানা
- টেলিফোন নম্বর
- নাম
একইভাবে, সুনির্দিষ্টভাবে ব্যক্তিগতভাবে শনাক্তযোগ্য না হলেও নির্দিষ্ট কিছু বিবরণ সংবেদনশীল বলে বিবেচিত হয়।
 উদাহরণস্বরূপ, যদিও টাইমজোন তথ্য ব্যক্তিগতভাবে শনাক্তযোগ্য বলে বিবেচিত হয় না, তবে এটি ব্যবহারকারীর আনুমানিক অবস্থানের একটি ইঙ্গিত দেয়।
প্রকাশের আগে নিরাপত্তা এবং গোপনীয়তা পর্যালোচনার অংশ হিসাবে লগ নীতি এবং গ্রহণযোগ্য বিবরণ অবশ্যই পরিচালনা করতে হবে।
ডিভাইস লগ
 android.permission.READ_LOGS ব্যবহার সহ সমস্ত ডিভাইস লগগুলিতে অ্যাক্সেস সীমাবদ্ধ:
- যদি ব্যাকগ্রাউন্ডে একটি অ্যাপ সমস্ত ডিভাইস লগ অ্যাক্সেসের অনুরোধ করে, তবে অ্যাপটি না থাকলে অনুরোধটি স্বয়ংক্রিয়ভাবে অস্বীকার করা হয়:
- সিস্টেম ইউআইডি শেয়ার করে।
-  একটি নেটিভ সিস্টেম প্রক্রিয়া ব্যবহার করে ( UID<APP_UID)।
-  DropBoxManagerব্যবহার করে।
- শুধুমাত্র ইভেন্ট লগ বাফার অ্যাক্সেস করে।
-  EventLogAPI ব্যবহার করে।
- যন্ত্রযুক্ত পরীক্ষা ব্যবহার করে।
-  যদি READ_LOGSএর সাথে একটি অ্যাপ ফোরগ্রাউন্ডে ডিভাইস লগগুলিতে অ্যাক্সেসের অনুরোধ করে, সিস্টেমটি ব্যবহারকারীকে অ্যাক্সেসের অনুরোধ অনুমোদন বা অস্বীকার করার জন্য অনুরোধ করে।
