Remote Logging হল একটি প্রক্রিয়া যা মোবাইল ডিভাইস থেকে লগগুলিকে কেন্দ্রীয় বিশ্লেষণ এবং মনিটরিংয়ের জন্য রিমোট সার্ভারে পাঠায়। লোকাল লগিংয়ের বিপরীতে, যা ডিভাইসে ডেটা সংরক্ষণ করে, রিমোট সংগ্রহ রিয়েল টাইমে সমস্ত ব্যবহারকারী ডিভাইস থেকে ত্রুটি এবং অসঙ্গতি দেখতে অনুমতি দেয়। Sentry Resource Library অনুসারে, remote logging ব্যবহার করে অ্যাপ্লিকেশনগুলি রিলিজের প্রথম ঘন্টার মধ্যে 92% প্রোডাকশন বাগ খুঁজে পায়, যেখানে শুধুমাত্র ক্র্যাশ রিপোর্ট ব্যবহার করলে এটি 15%। এটি যেকোনো মোবাইল ডেভেলপমেন্ট টিমের জন্য একটি বাধ্যতামূলক টুল: Firebase Crashlytics, Sentry এবং Datadog iOS এবং Android-এর জন্য প্রস্তুত SDK সরবরাহ করে।
মূল পয়েন্ট
Remote Logging হল রিমোট ডিভাইস থেকে লগ সংগ্রহ এবং বিশ্লেষণের জন্য কেন্দ্রীয় সার্ভারে প্রেরণের প্রক্রিয়া। মোবাইল ডেভেলপমেন্টের প্রেক্ষাপটে, remote logging শুধুমাত্র ক্র্যাশ রিপোর্টই নয়, কাস্টম ইভেন্ট, breadcrumbs, পারফরম্যান্স মেট্রিক এবং ব্যবহারকারী পরিস্থিতিও অন্তর্ভুক্ত করে।
Remote logging এবং crash reporting-এর মধ্যে প্রধান পার্থক্য হল সক্রিয়তা। Crash reporting শুধুমাত্র অ্যাপ্লিকেশন ক্র্যাশ সম্পর্কে ডেটা সংগ্রহ করে যা ইতিমধ্যে ঘটেছে। Remote logging ক্র্যাশের আগে ইভেন্টের ক্রম সংগ্রহ করে: ব্যবহারকারী কোন স্ক্রিন খুলেছে, কী অনুরোধ করেছে, কী ডেটা প্রবেশ করিয়েছে। এটি ব্যবহারকারীর সাথে যোগাযোগ না করেই ত্রুটি পরিস্থিতি পুনরুত্পাদন করতে দেয়।
Apple .logarchive-এর মাধ্যমে রিমোট লগ সংগ্রহের জন্য একটি বিল্ট-ইন প্রক্রিয়া সরবরাহ করে, কিন্তু প্রোডাকশন অ্যাপ্লিকেশনের জন্য প্রায় সর্বদা তৃতীয়-পক্ষের পরিষেবা ব্যবহার করা হয়। Android SDK-তে Logcat অন্তর্ভুক্ত রয়েছে, যা ADB-এর মাধ্যমে রিমোট অ্যাক্সেসযোগ্য, কিন্তু ডিবাগিং ছাড়া শেষ-ব্যবহারকারী ডিভাইসের জন্য নয়।
Remote logging আর্কিটেকচারে তিনটি উপাদান রয়েছে: ডিভাইসে ক্লায়েন্ট SDK যা লগ সংগ্রহ এবং বাফার করে, ডেটা পাঠানোর জন্য ট্রান্সপোর্ট প্রোটোকল এবং স্টোরেজ ও ভিজুয়ালাইজেশনের জন্য সার্ভার।
| উপাদান | ভূমিকা | উদাহরণ |
|---|---|---|
| ক্লায়েন্ট SDK | সংগ্রহ, বাফারিং, ব্যাচিং | Firebase SDK, Sentry Cocoa, Timber |
| ট্রান্সপোর্ট | HTTPS-এর মাধ্যমে ডেটা প্রেরণ | REST, gRPC, WebSocket |
| সার্ভার | স্টোরেজ, ইনডেক্সিং, অ্যালার্ট | Sentry, Crashlytics, Datadog |
ক্লায়েন্ট SDK লগগুলিকে RAM-তে বাফার করে এবং পর্যায়ক্রমে সেগুলিকে ব্যাচে সার্ভারে পাঠায়। ডিভাইস অফলাইন থাকলে, লগগুলি একটি লোকাল ফাইলে সংরক্ষিত হয় এবং পরবর্তী নেটওয়ার্ক সংযোগে পাঠানো হয়। বাফার আকার এবং পাঠানোর ব্যবধান কনফিগারযোগ্য: সাধারণ মান হল 50 ইভেন্ট বা 30 সেকেন্ড।
HTTPS REST remote logging-এর জন্য সবচেয়ে সাধারণ প্রোটোকল। SDK লগগুলিকে JSON-এ সিরিয়ালাইজ করে এবং POST অনুরোধের মাধ্যমে সার্ভার এন্ডপয়েন্টে পাঠায়। gRPC বাইনারি সিরিয়ালাইজেশন (Protocol Buffers) সহ একটি বিকল্প, যা JSON-এর তুলনায় 30–40% বেশি কমপ্যাক্ট এবং অস্থির সংযোগযুক্ত মোবাইল ডিভাইসে দ্রুততর। WebSocket ডিবাগিংয়ে রিয়েল-টাইম লগিংয়ের জন্য ব্যবহৃত হয় তবে শক্তি খরচের কারণে প্রোডাকশনে খুব কমই ব্যবহৃত হয়।
Firebase Crashlytics ক্র্যাশ রিপোর্ট এবং কাস্টম লগ সংগ্রহের জন্য Google-এর বিনামূল্যের পরিষেবা। এটি Firebase SDK-তে বিল্ট-ইন এবং আলাদা সার্ভারের প্রয়োজন হয় না। Crashlytics স্বয়ংক্রিয়ভাবে ক্র্যাশের সময় স্ট্যাক ট্রেস, ডিভাইস অবস্থা, OS সংস্করণ এবং খোলা স্ক্রিন সংগ্রহ করে।
Crashlytics-এ কাস্টম লগ log() পদ্ধতির মাধ্যমে যোগ করা হয় — এগুলি তাৎক্ষণিকভাবে সার্ভারে পাঠানো হয় না বরং একটি রিং বাফারে সংরক্ষিত হয় এবং পরবর্তী ক্র্যাশ রিপোর্টের সাথে সংযুক্ত হয়। এটি Sentry-র থেকে মূল পার্থক্য, যেখানে প্রতিটি লগ একটি পৃথক ইভেন্ট। Crashlytics-এ কাস্টম লগের সর্বোচ্চ পরিমাণ হল 64 KB প্রতি ক্র্যাশ।
// Firebase Crashlytics — Android-এ কাস্টম লগ
import com.google.firebase.crashlytics.FirebaseCrashlytics
class CheckoutViewModel {
fun processPayment(amount: Double) {
FirebaseCrashlytics.getInstance()
.log("Payment started: amount=$amount")
try {
process(amount)
} catch (e: Exception) {
FirebaseCrashlytics.getInstance()
.recordException(e)
}
}
}
Firebase Crashlytics নির্দিষ্ট ব্যবহারকারীদের সাথে ক্র্যাশ সংযুক্ত করতে setUserIdentifier সমর্থন করে। এটি নির্ধারণ করতে সাহায্য করে যে বাগটি ব্যাপক কিনা বা শুধুমাত্র একজন ব্যবহারকারীকে প্রভাবিত করে। setCustomKey প্রতিটি রিপোর্টে নির্বিচারে কী যোগ করে — A/B পরীক্ষার সংস্করণ, অঞ্চল, মূল্য পরিকল্পনা।
Sentry একটি ত্রুটি মনিটরিং প্ল্যাটফর্ম যা শুধুমাত্র ক্র্যাশ রিপোর্টই নয়, সমস্ত কাস্টম ইভেন্ট (breadcrumbs) স্বতন্ত্র রেকর্ড হিসাবে সংরক্ষণ করে। Crashlytics-এর বিপরীতে, Sentry কালানুক্রমিক ক্রমে ত্রুটির আগে ইভেন্টের ক্রম দেখতে দেয় — breadcrumbs ক্র্যাশ লগ থেকে পুনর্নির্মাণের প্রয়োজন ছাড়াই ইন্টারফেসে দৃশ্যমান।
Sentry SDK স্বয়ংক্রিয়ভাবে সিস্টেম ইভেন্টের জন্য breadcrumbs সংগ্রহ করে: UIViewController লাইফসাইকেল পরিবর্তন (viewDidLoad, viewWillAppear), স্পর্শ, বাটন প্রেস, URLSession-এর মাধ্যমে HTTP অনুরোধ। এই সমস্ত ইভেন্ট কাস্টম breadcrumbs-এর সাথে ত্রুটি টাইমলাইনে প্রদর্শিত হয়। Android-এর জন্য, Activity এবং Fragment লাইফসাইকেল, onClick ইভেন্ট এবং OkHttp-এর মাধ্যমে নেটওয়ার্ক অনুরোধ একইভাবে সংগ্রহ করা হয়।
iOS এবং Android-এর জন্য Sentry SDK স্বয়ংক্রিয়ভাবে UI ইভেন্টের breadcrumbs সংগ্রহ করে: স্পর্শ, নেভিগেশন, লাইফসাইকেল। ডেভেলপাররা টাইপ, ক্যাটাগরি এবং লেভেল উল্লেখ করে addBreadcrumb()-এর মাধ্যমে কাস্টম breadcrumbs যোগ করতে পারেন। Sentry distributed tracing সমর্থন করে: লগার ক্লায়েন্ট-সাইড breadcrumbs-কে ট্রেস আইডির মাধ্যমে ব্যাকএন্ড অনুরোধের সাথে সংযুক্ত করে।
import Sentry
func trackCartEvent(action: String, itemId: String) {
let crumb = Breadcrumb()
crumb.level = .info
crumb.category = "cart"
crumb.message = "Cart \(action): \(itemId)"
crumb.data = ["action": action, "item_id": itemId]
SentrySDK.addBreadcrumb(crumb)
}
Logcat হল Android-এর মানক লগিং সিস্টেম, যা Android Debug Bridge (ADB)-এর মাধ্যমে অ্যাক্সেসযোগ্য। Logcat সমস্ত সিস্টেম এবং অ্যাপ্লিকেশন বার্তা সংগ্রহ করে, স্তর (V, D, I, W, E, F) এবং ট্যাগ অনুসারে সংগঠিত। Logcat-এ রিমোট অ্যাক্সেস USB বা Wi-Fi-এর মাধ্যমে ADB-তে কাজ করে, তবে শুধুমাত্র ডিবাগ মোডে ডিভাইসের জন্য — USB সংযোগ ছাড়া ডিভাইসে প্রোডাকশন অ্যাপ্লিকেশন অ্যাক্সেসযোগ্য নয়।
Android-এ প্রোডাকশনে রিমোট লগিংয়ের জন্য বিকল্প ব্যবহার করা হয়: Logcat নিজে সার্ভারে লগ পাঠাতে পারে না। এর ভূমিকা হল লোকাল ডায়াগনস্টিকস। তবে র্যাপার (Timber, LogcatLive) রয়েছে যা পরিচিত Log.d / Log.e API বজায় রেখে Firebase বা Sentry-তে বার্তা ফরোয়ার্ড করে। Timber অ্যাপ্লিকেশন কোড না বদলেই হ্যান্ডলার পরিবর্তন করতে দেয় — একটি ডিবাগ ট্রি Logcat-এ লেখে, একটি রিলিজ ট্রি ব্যাচিং এবং কম্প্রেশন সহ সার্ভারে পাঠায়।
ব্যাচিং (Batching) হল ট্রাফিক এবং ব্যাটারি বাঁচানোর জন্য একাধিক লগকে একটি HTTP অনুরোধে গ্রুপ করা। 50টি পৃথক POST অনুরোধের পরিবর্তে, SDK একটি JSON অ্যারে পাঠায়। সাধারণ কৌশল: সময়সূচী অনুসারে পাঠানো (প্রতি 30 সেকেন্ড), সংখ্যা অনুসারে (প্রতি 50 ইভেন্ট), বা ইভেন্ট অনুসারে (শুধুমাত্র গুরুতর ত্রুটিতে)।
লক্ষ লক্ষ ব্যবহারকারীর অ্যাপ্লিকেশনের জন্য, লগের পরিমাণ প্রতিদিন টেরাবাইটে পৌঁছাতে পারে। ব্যাচিং অনুরোধের সংখ্যা 10–50 গুণ কমায় এবং সার্ভার লোড হ্রাস করে। Sentry ট্রান্সপোর্ট স্তরে gzip কম্প্রেশন ব্যবহার করে, যা ডেটার পরিমাণ অতিরিক্ত 60–70% কমায়।
// Android-এ ব্যাচিংয়ের সহজ বাস্তবায়ন
class LogBatcher {
private val buffer = mutableListOf<LogEvent>()
private val maxSize = 50
private val intervalMs = 30_000L
fun append(event: LogEvent) {
buffer.add(event)
if (buffer.size >= maxSize) flush()
}
suspend fun flush() {
val batch = buffer.toList()
buffer.clear()
sendToServer(batch)
}
}
gzip হল লগের HTTP প্রেরণের জন্য মানক কম্প্রেশন পদ্ধতি। Sentry এবং Crashlytics SDK পাঠানোর আগে স্বয়ংক্রিয়ভাবে অনুরোধের বডি কম্প্রেস করে। ডিডুপ্লিকেশন — ক্লায়েন্ট পাশে ডুপ্লিকেট বার্তা অপসারণ: যদি একই ইভেন্ট প্রতি সেকেন্ডে 100 বার ঘটে, SDK এটি count = 100 ফিল্ড সহ একবার পাঠায়।
সবচেয়ে সাধারণ ভুল হল সংবেদনশীল ডেটা লগ করা। Remote logging SDK সার্ভারে ডেটা প্রেরণ করে, এবং যদি একজন ডেভেলপার ভুলবশত পাসওয়ার্ড, টোকেন বা ব্যবহারকারীর ইমেল লগ করে, এই ডেটা ক্লাউড ইনফ্রাস্ট্রাকচারে চলে যায়। সর্বদা SDK স্তরে PII (ব্যক্তিগতভাবে সনাক্তযোগ্য তথ্য) ফিল্টারিং ব্যবহার করুন: Sentry-তে পাঠানোর আগে ডেটা পরিষ্কার করার জন্য একটি বিল্ট-ইন beforeSend হুক রয়েছে।
দ্বিতীয় সাধারণ সমস্যা হল অতিরিক্ত লগিং। যদি প্রতিটি আঙুলের নড়াচড়া সার্ভারে পাঠানো হয়, ডেটার পরিমাণ দ্রুতগতিতে বাড়ে এবং সার্ভার খরচও বাড়ে। একটি লগিং বাজেট নির্ধারণ করুন: প্রোডাকশনে প্রতি ব্যবহারকারী প্রতি মিনিটে 1–5 ইভেন্টের বেশি নয়। ডিবাগ লগ শুধুমাত্র সেই ফ্ল্যাগ দিয়ে পাঠান যা নির্দিষ্ট ডিভাইসের জন্য সক্রিয় করা হয়েছে।
তৃতীয় ভুল হল অফলাইন পরিস্থিতি উপেক্ষা করা। যদি SDK নেটওয়ার্ক না থাকলে লগ হারায় এবং পুনরায় সংযোগের সময় সেগুলি পুনরুদ্ধার না করে, তাহলে অস্থির সংযোগযুক্ত ব্যবহারকারীদের জন্য remote logging অকেজো। সমস্ত SDK (Firebase, Sentry) স্বয়ংক্রিয়ভাবে লগকে একটি লোকাল ফাইলে ক্যাশ করে এবং নেটওয়ার্ক উপলব্ধ হলে পাঠায়, কিন্তু এই সেটিং পরীক্ষা করা প্রয়োজন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Crash reporting শুধুমাত্র অ্যাপ্লিকেশন ক্র্যাশ সম্পর্কে তথ্য সংগ্রহ করে। Remote Logging সমস্ত ইভেন্ট সংগ্রহ করে: কাস্টম লগ, breadcrumbs, পারফরম্যান্স মেট্রিক, UI ইভেন্ট। Crash reporting হল remote logging-এর একটি উপসেট, এর বিকল্প নয়।
Crashlytics বিনামূল্যে এবং মৌলিক ক্র্যাশ রিপোর্টের জন্য যথেষ্ট। Sentry ভাল যদি আপনার breadcrumbs, distributed tracing, কাস্টম ড্যাশবোর্ড এবং নমনীয় অ্যালার্ট প্রয়োজন হয়। কমপ্লায়েন্স প্রয়োজনীয়তা সহ এন্টারপ্রাইজ প্রজেক্টের জন্য, Sentry self-hosted সংস্করণে উপলব্ধ।
লগিং লেভেল ব্যবহার করুন: isDebuggable ফ্ল্যাগের মাধ্যমে শুধুমাত্র ডেভেলপারের ডিভাইস থেকে debug/info লগ পাঠান। beforeSend হুকের মাধ্যমে অন্যান্য লেভেল (warn, error) ফিল্টার করুন, PII আছে এমন ফিল্ড সরিয়ে ফেলুন। প্রতি সেশনে সর্বোচ্চ লগ আকার নির্ধারণ করুন।
Logcat সার্ভারে রিমোট পাঠানো সমর্থন করে না। Android-এ remote logging-এর জন্য, Firebase বা Sentry-তে ফরোয়ার্ড করতে Timber ব্যবহার করুন এবং Logcat USB-এর মাধ্যমে ডিবাগিংয়ের জন্য রাখুন। Timber Android Log API প্রতিস্থাপন করে এবং প্ল্যান্টেবল ট্রি যোগ করে।
প্রতি ডিভাইস প্রতি মিনিটে 50 ইভেন্ট পর্যন্ত ব্যাটারি খরচে লক্ষণীয়ভাবে প্রভাব ফেলে না যদি ব্যাচিং ব্যবহার করা হয় (একটি করে না পাঠিয়ে ব্যাচে পাঠানো)। 200+ ইভেন্ট প্রতি মিনিটে, Wi-Fi/মডেম ক্রমাগত সক্রিয় থাকবে — ব্যাটারি 15–25% দ্রুত শেষ হয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন