Log Level — গুরুতরতার মাত্রা অনুযায়ী লগিং বার্তাগুলির শ্রেণীবিভাগ, যা ডেভেলপারদের অ্যাপ্লিকেশনের বিভিন্ন ধাপে আউটপুট তথ্যের পরিমাণ নিয়ন্ত্রণ করতে দেয়। Google Android Developers, 2024 অনুসারে, সঠিক লগিং লেভেল নির্বাচন প্রোডাকশনে লগের পরিমাণ 85–95% হ্রাস করে এবং ত্রুটি নির্ণয়ের গতি বাড়ায়। প্রতিটি লেভেল তার নিজস্ব কাজ সমাধান করে — ডেভেলপমেন্ট পর্যায়ে ডিবাগিং থেকে প্রোডাকশনে গুরুতর ব্যর্থতার পর্যবেক্ষণ পর্যন্ত।
মূল পয়েন্ট
Log Level প্রতিটি লগ বার্তার একটি বৈশিষ্ট্য যা এর গুরুত্ব এবং প্রক্রিয়াকরণের জরুরিতা নির্ধারণ করে। আধুনিক iOS এবং Android প্ল্যাটফর্ম 6–7 লেভেলের একটি একীভূত স্কেল সমর্থন করে: সবচেয়ে বিস্তারিত (Verbose/Trace) থেকে গুরুতর (Error/Assert) পর্যন্ত। লেভেলের পছন্দ নির্ধারণ করে যে বর্তমান অ্যাপ্লিকেশন কনফিগারেশনের অধীনে বার্তাটি লগে লেখা হবে কিনা।
Log Level ধারণাটি গুরুতরতা পিরামিড নীতির উপর ভিত্তি করে: লেভেল যত উচ্চ, তাতে তত কম বার্তা আউটপুট হয়। Semaphore CI, 2024 অনুসারে, প্রোডাকশন অ্যাপ্লিকেশনে বিতরণ এইরকম: Info — 60% বার্তা, Warn — 25%, Error — 10%, Debug — 5%. Verbose বার্তাগুলি প্রোডাকশনে সম্পূর্ণরূপে নিষ্ক্রিয় করা উচিত।
প্রতিটি প্ল্যাটফর্ম তার নিজস্ব API-র মাধ্যমে Log Level প্রয়োগ করে। Android v(), d(), i(), w(), e() পদ্ধতি সহ android.util.Log ব্যবহার করে। Apple default, info, debug, error, fault লেভেল সহ OSLog ব্যবহার করে। Timber এবং CocoaLumberjack-এর মতো লাইব্রেরিগুলি এই মানক API-গুলির উপরে অতিরিক্ত কার্যকারিতা যোগ করে।
Google I/O 2023 অনুসারে, ভুল Log Level নির্বাচন প্রোডাকশনে 40% কর্মক্ষমতা সমস্যার কারণ। ডেভেলপাররা রিলিজ বিল্ডে Debug লগ রেখে দেয়, যা ডিস্কে অতিরিক্ত লেখা এবং ত্বরিত ব্যাটারি ডিসচার্জের দিকে নিয়ে যায়।
Verbose (TRACE) — সবচেয়ে বিস্তারিত লেভেল, শুধুমাত্র ডেভেলপমেন্টের জন্য। এই লেভেলে সমস্ত মধ্যবর্তী গণনা, লুপ পুনরাবৃত্তি এবং অ্যালগরিদমের প্রতিটি ধাপের ফলাফল আউটপুট হয়। Android-এ, এই লেভেল Log.v()-এর সাথে মিলে যায়, iOS-এ — OSLog টাইপ debug (iOS 14-এর আগে os_trace ব্যবহৃত হত)।
Debug — ডেভেলপমেন্ট এবং পরীক্ষার সময় দরকারী ডিবাগিং বার্তা। এগুলিতে মূল অবজেক্টের অবস্থা, SQL কোয়েরি ফলাফল এবং API কল প্যারামিটার সম্পর্কে তথ্য থাকে। Verbose-এর বিপরীতে, Debug বার্তাগুলি গঠনগত এবং শব্দার্থগতভাবে অর্থপূর্ণ। iOS-এ, এই লেভেল OSLogType.debug-এর সাথে মিলে যায়।
Info — অ্যাপ্লিকেশনের সাধারণ ইভেন্ট সম্পর্কে তথ্যপূর্ণ বার্তা: SDK আরম্ভ, সফল প্রমাণীকরণ, স্ক্রিন খোলা, সার্ভার থেকে ডেটা প্রাপ্তি। Info বার্তাগুলিতে ব্যবহারকারীদের ব্যক্তিগত ডেটা থাকা উচিত নয় এবং প্রোডাকশন বিশ্লেষণের জন্য নিরাপদ হওয়া উচিত। iOS-এ OSLogType.info ব্যবহৃত হয়, Android-এ — Log.i()।
Warn — সম্ভাব্য সমস্যা সম্পর্কে সতর্কতা। অ্যাপ্লিকেশন কাজ চালিয়ে যায়, কিন্তু পরিস্থিতি মনোযোগ প্রয়োজন: ক্যাশে আকার সীমার কাছাকাছি, API-র পুরানো সংস্করণ, ধীর নেটওয়ার্ক প্রতিক্রিয়া, সংযোগ পুনরায় চেষ্টা। Android-এ — Log.w(), iOS-এ — OSLogType.default (সতর্কতার জন্য)।
Error — গুরুতর ত্রুটি যেখানে অ্যাপ্লিকেশন অনুরোধকৃত অপারেশন করতে পারে না কিন্তু কাজ চালিয়ে যায়: ব্যর্থ API অনুরোধ, সংযোগ হারানো, DB লেখার ত্রুটি, অনুমতির অভাব। iOS-এ ত্রুটির জন্য OSLogType.error ব্যবহৃত হয়, Android-এ — Log.e()।
Assert (WTF) — সর্বোচ্চ লেভেল, “এটা ঘটতে পারে না” পরিস্থিতি নির্দেশ করে। সেই বাগগুলি লগ করতে ব্যবহৃত হয় যা সিস্টেমের মৌলিক অপরিবর্তনীয় নিয়ম লঙ্ঘন করে। Android-এ, Assert বার্তাগুলি ডিফল্টরূপে রিলিজ বিল্ডে প্রদর্শিত হয় না। iOS-এ, WTF (What a Terrible Failure) OSLogType.fault-এর মাধ্যমে পরিচালিত হয়।
Android Log API — android.util.Log প্যাকেজ থেকে অন্তর্নির্মিত লগিং প্রক্রিয়া। এটি 6টি স্ট্যাটিক পদ্ধতি প্রদান করে: Log.v(), Log.d(), Log.i(), Log.w(), Log.e() এবং Log.wtf()। প্রতিটি পদ্ধতি tag (উৎস শনাক্তকারী স্ট্রিং) এবং msg (বার্তা পাঠ্য) নেয়।
class UserRepository {
companion object {
private val TAG = "UserRepo"
}
suspend fun loadUser(id: String): User {
Log.d(TAG, "$id সহ ব্যবহারকারী লোড হচ্ছে")
return try {
val response = api.fetchUser(id)
Log.i(TAG, "ব্যবহারকারী সফলভাবে লোড হয়েছে")
response.toUser()
} catch (e: Exception) {
Log.e(TAG, "ব্যবহারকারী লোড করতে ব্যর্থ: ${e.message}")
throw e
}
}
}
লেভেল অনুযায়ী ফিল্টারিং Android Logcat-এ ADB-র মাধ্যমে করা হয়: adb logcat *:E শুধুমাত্র Error বার্তা দেখাবে। প্রোডাকশন বিল্ডে, যখন মিনিফিকেশন সক্ষম থাকে তখন ProGuard/R8 দ্বারা সমস্ত Log.v() এবং Log.d() কল সরিয়ে ফেলা হয়। Log.i(), Log.w() এবং Log.e() থাকে, তাই এই পদ্ধতিগুলির মাধ্যমে সংবেদনশীল ডেটা আউটপুট না করা গুরুত্বপূর্ণ।
রানটাইমে কাস্টম ফিল্টারিংয়ের জন্য, Android Log.isLoggable(tag, level) প্রদান করে — একটি পদ্ধতি যা পরীক্ষা করে যে নির্দিষ্ট লেভেলটি প্রদত্ত tag-এর জন্য সক্ষম কিনা। এটি অ্যাপ্লিকেশন পুনর্নির্মাণ না করেই একটি নির্দিষ্ট মডিউলের জন্য বিস্তারিত লগিং গতিশীলভাবে সক্ষম করতে দেয়।
OSLog — Apple-এর একীভূত লগিং সিস্টেম, যা অবচিত NSLog-কে প্রতিস্থাপন করেছে। OSLog 5টি লেভেল প্রদান করে: debug, info, default (notice), error এবং fault। প্রধান সুবিধা হল গঠনগত লগিং ফরম্যাটেড স্ট্রিং এবং কনসোলের মাধ্যমে গতিশীল ফিল্টারিং সমর্থন সহ।
import OSLog
let logger = Logger(
subsystem: "com.example.app",
category: "network"
)
func fetchData(from url: URL) {
logger.debug("Starting request to \(url.absoluteString)")
do {
let data = try Data(contentsOf: url)
logger.info("Received \(data.count) bytes")
} catch {
logger.error("Request failed: \(error.localizedDescription)")
}
}
OSLog ফিল্টারিং সিস্টেম অপারেটিং সিস্টেম স্তরে কাজ করে। Debug বার্তাগুলি শুধুমাত্র তখনই লেখা হয় যখন ডিবাগার সংযুক্ত থাকে বা -com.apple.CoreData.Logging.debug 1 আর্গুমেন্ট সক্ষম থাকে। Info বার্তাগুলি ডিভাইস মেমরিতে (512 KB পর্যন্ত) সংগ্রহ করা হয় এবং Console.app-এর মাধ্যমে অ্যাক্সেসযোগ্য। Error এবং fault বার্তাগুলি ক্রমাগত লেখা হয় এবং ক্র্যাশ-রিপোর্টিং সিস্টেমের মাধ্যমে সংগ্রহের জন্য উপলব্ধ।
OSLog-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য: প্লেসহোল্ডার সহ ফরম্যাটেড স্ট্রিং। Swift স্ট্রিং ইন্টারপোলেশনের (যা লেভেল নির্বিশেষে সর্বদা মূল্যায়িত হয়) পরিবর্তে, OSLog সংবেদনশীল ডেটা পৃথক করতে %{public}@ এবং %{private}@ সহ os_log ফর্ম্যাট ব্যবহার করে। প্রোডাকশন লগে ব্যক্তিগত প্যারামিটারগুলি মাস্ক করা হয়।
মূল নিয়ম — প্রোডাকশনে ন্যূনতম লেভেলের সেট: Info, Warn, Error, Assert। Debug এবং Verbose নিষ্ক্রিয় করা উচিত। কারণ নিরাপত্তার চেয়ে কর্মক্ষমতা বেশি: প্রতিটি লগ কল স্ট্রিং ফরম্যাট করতে CPU সময় নেয়, এমনকি যদি বার্তা আউটপুট না হয়।
গুরুত্বপূর্ণ অপ্টিমাইজেশন — লগ কলগুলিতে কখনও স্ট্রিং ইন্টারপোলেশন ব্যবহার করবেন না। যদি log() কলের আগে স্ট্রিং তৈরি করা হয়, তবে লেভেল নিষ্ক্রিয় থাকলেও CPU সময় নষ্ট হয়। ল্যাম্বডা বা গার্ড শর্তের মাধ্যমে অলস ফরম্যাটিং ব্যবহার করুন।
Android-এ, Log.isLoggable() পদ্ধতি এই উদ্দেশ্য পূরণ করে; OSLog-এ, প্লেসহোল্ডার সহ নেটিভ ফরম্যাটেড স্ট্রিং সমর্থিত। Android-এর জন্য Timber timber.log.Tree-এর মাধ্যমে ট্রির ভিতরে লেভেল পরীক্ষা সহ সমস্যার সমাধান করে।
Remote Log Level — একটি অনুশীলন যেখানে Firebase Remote Config বা অনুরূপ পরিষেবার মাধ্যমে সার্ভার থেকে লগিং লেভেল নিয়ন্ত্রিত হয়। যদি প্রোডাকশনে একটি জটিল ত্রুটি ঘটে, তবে ডেভেলপার নির্বাচিত ব্যবহারকারী গোষ্ঠীর ডিভাইসে একটি নির্দিষ্ট মডিউলের জন্য দূরবর্তীভাবে Debug লগিং সক্ষম করতে পারেন।
Firebase, 2024 অনুসারে, এই অনুশীলন বিরল বাগ নির্ণয়ের সময় 60% হ্রাস করে এবং ডিবাগ বিল্ড ইনস্টল না করেই সমস্যার সম্পূর্ণ চিত্র পেতে দেয়। প্রধান সীমাবদ্ধতা — কনফিগারেশন প্রাপ্তির পরে লগিং শুধুমাত্র অ্যাপ্লিকেশনের পরবর্তী লঞ্চে সক্ষম হয়।
Android-এ BuildConfig.DEBUG এবং Swift-এ #if DEBUG হল মানক শর্তসাপেক্ষ কম্পাইলেশন প্রক্রিয়া যা রিলিজ বিল্ডে ডিবাগ লেভেল নিষ্ক্রিয় করে। পরিষ্কার আর্কিটেকচারের জন্য, শর্তসাপেক্ষ নির্দেশ দিয়ে ব্যবসায়িক যুক্তি জটিল না করতে Log Level নির্বাচনকে DI-কন্টেইনার বা লগার ফ্যাক্টরিতে স্থানান্তর করার পরামর্শ দেওয়া হয়।
প্রথম নিয়ম — প্রতিটি লগ কলকে “কে, কী, কখন” প্রশ্নের উত্তর দেওয়া উচিত। কে — উপাদান বা মডিউল (Android-এ tag, iOS-এ category)। কী — নির্দিষ্ট ইভেন্ট বা অবস্থা পরিবর্তন। কখন — টাইমস্ট্যাম্প, যা লগিং সিস্টেম দ্বারা স্বয়ংক্রিয়ভাবে যুক্ত হয়।
দ্বিতীয় নিয়ম — Info এবং তার উপরের মাধ্যমে সংবেদনশীল ডেটা লগ করবেন না। পাসওয়ার্ড, টোকেন, ইমেল, ফোন নম্বর, সঠিক ভৌগলিক স্থানাঙ্ক — যে কোনও লগে কঠোরভাবে নিষিদ্ধ যা প্রোডাকশনে যায়। প্রয়োজনে মাস্কিং ব্যবহার করুন: “email: us***@example.com.”
তৃতীয় নিয়ম — Warn লেভেল ডেভেলপারের দায়িত্ব, Error — টিমের। Warn মানে “এখানে সম্ভাব্য সমস্যা আছে, নজর রাখুন।” Error মানে “এখানে সমস্যা আছে, এটি ঠিক করুন।” প্রত্যাশিত এবং পরিচালিত পরিস্থিতির জন্য Error ব্যবহার করবেন না (যেমন, 404 API ত্রুটি)।
চতুর্থ নিয়ম — ধারাবাহিকতা। সম্পূর্ণ প্রকল্পের tag এবং শ্রেণীর নামকরণের জন্য একীভূত নিয়ম ব্যবহার করা উচিত। Android tag-এর জন্য ClassName.methodName এবং iOS category-র জন্য module.subsystem সুপারিশ করা হয়। এটি উপাদান অনুযায়ী লগ দ্রুত ফিল্টার করতে দেয়।
পঞ্চম নিয়ম — আপনার লগ পরীক্ষা করুন। ইউনিট পরীক্ষায় যাচাই করুন যে নির্দিষ্ট পরিস্থিতিতে সঠিক Log Level কল করা হয়েছে। এই উদ্দেশ্যে মক লগিং লাইব্রেরি বিদ্যমান: Android-এর জন্য Mockito, iOS-এর জন্য Cuckoo। পরীক্ষায় লেভেল পরীক্ষা করা প্রোডাকশনে ডিবাগ বার্তা ফাঁস প্রতিরোধ করে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
ত্বরিত ব্যাটারি ডিসচার্জ এবং ডিস্কে অতিরিক্ত লেখা। প্রতিটি Debug লগ একটি স্ট্রিং ফরম্যাট করে এবং বাফারে ডেটা লেখে। ফ্ল্যাশ মেমরি সহ ডিভাইসে, এটি স্টোরেজের পরিধান ত্বরান্বিত করে। তাছাড়া, Debug লগে সংবেদনশীল ডেটা থাকতে পারে যা প্রোডাকশনে দেখার জন্য নয়।
Debug — অনুরোধ এবং প্রতিক্রিয়া বডি, হেডার এবং স্ট্যাটাস কোডের জন্য। Info — অনুরোধ সম্পাদনের তথ্যের জন্য (URL, পদ্ধতি, সময়কাল)। Error — 4xx/5xx কোড সহ ব্যর্থ অনুরোধের জন্য। প্রোডাকশনে নেটওয়ার্ক লগের জন্য কখনও Verbose ব্যবহার করবেন না।
OSLogType.default (notice লেভেল) — মাঝারি গুরুত্বের বার্তা, সিস্টেম লগে সংরক্ষিত এবং Console.app-এ দৃশ্যমান। OSLogType.info — প্রযুক্তিগত বার্তা, স্থায়ীভাবে সংরক্ষিত নয়, শুধুমাত্র Instruments-এর মাধ্যমে সক্রিয় প্রোফাইলিংয়ের সময় উপলব্ধ।
R8/ProGuard রিলিজ বিল্ডে মিনিফিকেশন সক্ষম থাকলে Log.v() এবং Log.d() সরিয়ে দেয়। Log.i(), Log.w() এবং Log.e() সংরক্ষিত থাকে। সমস্ত লগ সম্পূর্ণরূপে সরাতে, সমস্ত লেভেল উল্লেখ করে একটি কাস্টম নিয়ম -assumenosideeffects class android.util.Log প্রয়োজন।
না — অত্যধিক লগিং পঠনযোগ্যতা এবং কর্মক্ষমতা ক্ষতিগ্রস্ত করে। শুধুমাত্র জটিল বা অ্যাসিঙ্ক্রোনাস পদ্ধতিতে প্রবেশ লগ করুন। সিঙ্ক্রোনাস পদ্ধতির জন্য, প্রত্যাবর্তন বা ত্রুটি বিন্দুতে একটি লগ যথেষ্ট। কল ট্রেসিংয়ের জন্য Debug লেভেল ব্যবহার করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন