Structured Logging হল লগ রেকর্ড করার একটি পদ্ধতি যেখানে প্রতিটি বার্তা কী-ভ্যালু জোড়া সহ মেশিন-পঠনযোগ্য ফর্ম্যাটে উপস্থাপিত হয়, অসংগঠিত পাঠ্যের পরিবর্তে। সমতল স্ট্রিংয়ের বিপরীতে, স্ট্রাকচার্ড লগে মেটাডেটা থাকে: টাইমস্ট্যাম্প, লেভেল, মডিউল, অনুরোধ আইডি — এবং বিশ্লেষণ সিস্টেম দ্বারা ইনডেক্স করা যেতে পারে। O'Reilly Effective Logging অনুসারে, ফিল্ড দ্বারা ফিল্টার করার ক্ষমতার কারণে স্ট্রাকচার্ড ফর্ম্যাটে রূপান্তর ঘটনা অনুসন্ধানের সময় ঘন্টা থেকে মিনিটে কমিয়ে দেয়। এটি আধুনিক মোবাইল এবং সার্ভার ডেভেলপমেন্টে ডি ফ্যাক্টো স্ট্যান্ডার্ড: JSON এবং logfmt লগকে চোখ দিয়ে নয় বরং প্রোগ্রামের মাধ্যমে প্রক্রিয়া করার অনুমতি দেয়।
মূল পয়েন্ট
Structured Logging হল লগ রেকর্ড করার একটি পদ্ধতি যেখানে প্রতিটি বার্তায় নামযুক্ত ফিল্ড এবং টাইপকৃত মান থাকে। User 42 logged in from device ABC এর মতো স্ট্রিংয়ের পরিবর্তে, একটি স্ট্রাকচার্ড লগ ফিল্ডের সেটের মতো দেখায়: user_id=42, event=login, device_id=ABC, timestamp=2026-07-04T10:30:00Z।
টেক্সট লগের তুলনায় স্ট্রাকচার্ড লগের প্রধান সুবিধা হল প্রোগ্রামেটিক প্রক্রিয়াকরণের ক্ষমতা। টেক্সট লগ পার্স করার জন্য রেগুলার এক্সপ্রেশন এবং স্ট্রিং ফর্ম্যাট সম্পর্কে অনুমানের প্রয়োজন হয়। স্ট্রাকচার্ড লগ ক্ষতি ছাড়াই পার্স করা হয়: প্রতিটি ফিল্ডের একটি পরিচিত টাইপ এবং নাম থাকে, যা অতিরিক্ত প্রক্রিয়াকরণ ছাড়াই ব্যবহারকারী 42-এর জন্য গত এক ঘন্টায় সমস্ত প্রমাণীকরণ ত্রুটি খুঁজুন এর মতো কোয়েরি তৈরির অনুমতি দেয়।
Honeycomb.io (2023) অনুসারে, প্রোডাকশনে structured logging ব্যবহারকারী দলগুলি টেক্সট লগ এবং grep-এর উপর নির্ভরশীল দলগুলির তুলনায় গড়ে 4 গুণ দ্রুত ঘটনা সনাক্ত করে।
Structured Logging বিভিন্ন সিরিয়ালাইজেশন ফর্ম্যাট সমর্থন করে। ফর্ম্যাটের পছন্দ অবকাঠামোর উপর নির্ভর করে: JSON Elasticsearch এবং ক্লাউড সিস্টেমের সাথে সংহতকরণের জন্য সুবিধাজনক, logfmt tail এবং grep এর মাধ্যমে কনসোলে দেখার জন্য, Protocol Buffers ব্যান্ডউইথ সীমাবদ্ধতা সহ উচ্চ-ক্ষমতা সম্পন্ন সিস্টেমের জন্য।
| ফর্ম্যাট | উদাহরণ | কখন ব্যবহার করবেন |
|---|---|---|
| JSON | {"event":"login","user_id":42} | ELK Stack, ক্লাউড কালেক্টর, মাইক্রোসার্ভিস |
| Logfmt | event=login user_id=42 duration_ms=150 | কনসোল, tail, heroku logs |
| MessagePack | JSON এর বাইনারি সমতুল্য | উচ্চ-লোড সিস্টেম, IoT |
JSON স্ট্রাকচার্ড লগের জন্য সবচেয়ে সাধারণ ফর্ম্যাট। এটি সমস্ত সংগ্রহ সিস্টেম দ্বারা নেটিভভাবে সমর্থিত: Logstash, Fluentd, Amazon CloudWatch, Google Cloud Logging। JSON লগ মানুষ সহজেই পড়তে পারে এবং অতিরিক্ত লাইব্রেরি ছাড়াই যেকোনো প্রোগ্রামিং ভাষা দ্বারা পার্স করা যায়। প্রধান ত্রুটি হল ভার্বোসিটি: প্রতিটি কী-ভ্যালু জোড়ার জন্য উদ্ধৃতি এবং কোলন প্রয়োজন, যা logfmt-এর তুলনায় সংরক্ষিত ডেটার পরিমাণ 30–50% বাড়িয়ে দেয়।
Logfmt Heroku-তে কনসোল ভিজিবিলিটির জন্য তৈরি করা হয়েছিল। এটি JSON-এর চেয়ে বেশি কমপ্যাক্ট, মানুষের পঠনযোগ্যতা বজায় রাখে এবং cut এবং awk দিয়ে সহজেই পার্স করা যায়। উদাহরণ: ts=2026-07-04T10:30:00Z level=error module=api status=500। Logfmt-এর বেশিরভাগ অক্ষর এস্কেপ করার প্রয়োজন হয় না এবং এটি কন্টেইনারে stdout লগিংয়ের জন্য উপযুক্ত।
মোবাইল অ্যাপ্লিকেশনে, Structured Logging তিনটি মূল সমস্যা সমাধান করে: ডিভাইসে পুনরুৎপাদন ছাড়াই ক্র্যাশের কারণ খুঁজে বের করা, ব্যবহারকারী সেশন ট্র্যাক করা এবং অ্যাপ সংস্করণ অনুযায়ী কর্মক্ষমতা বিশ্লেষণ করা।
মোবাইল ডিভাইসে টেক্সট লগ প্রায় অকেজো — একজন ডেভেলপার ব্যবহারকারীর ডিভাইসে লগ grep করতে পারে না। স্ট্রাকচার্ড লগ ক্লাউড সিস্টেমে (Firebase, Sentry, Datadog) পাঠানো হয় এবং সেখানে ইনডেক্স করা হয়। আপনি iOS 17.4-এ সমস্ত ক্র্যাশ দেখান, অ্যাপ সংস্করণ 3.2, চেকআউট মডিউলে এর মতো একটি কোয়েরি তৈরি করতে পারেন এবং সেকেন্ডের মধ্যে সঠিক নির্বাচন পেতে পারেন।
Sentry (2024) অনুসারে, স্ট্রাকচার্ড breadcrumbs ব্যবহারকারী অ্যাপ্লিকেশনগুলিতে শুধুমাত্র ত্রুটি টেক্সট লগ করা অ্যাপ্লিকেশনের তুলনায় প্রতিটি ক্র্যাশ রিপোর্টে 60% বেশি প্রসঙ্গ থাকে। এটি সরাসরি বাগ ফিক্সের গতিকে প্রভাবিত করে।
ELK Stack — Elasticsearch, Logstash, Kibana — স্ট্রাকচার্ড লগের সাথে কাজ করার জন্য মানক অবকাঠামো হিসাবে রয়ে গেছে। Logstash JSON-এ লগ গ্রহণ করে, সেগুলি রূপান্তরিত করে এবং ইনডেক্সিংয়ের জন্য Elasticsearch-এ পাঠায়, Kibana কোয়েরি এবং ড্যাশবোর্ডের জন্য ভিজুয়াল ইন্টারফেস সরবরাহ করে।
মোবাইল অ্যাপ্লিকেশনের জন্য, ক্লাউড সমাধান জনপ্রিয়: Firebase Crashlytics কাস্টম লগ সহ, Sentry breadcrumbs সহ, Datadog APM ট্র্যাকিং সহ। তারা সরাসরি মোবাইল SDK থেকে স্ট্রাকচার্ড লগ গ্রহণ করে এবং নিজস্ব ব্যাকএন্ড স্থাপনের প্রয়োজন হয় না। Firebase ক্র্যাশ রিপোর্টের জন্য বিনামূল্যের প্যাকেজ সরবরাহ করে, Sentry ডিস্ট্রিবিউটেড ট্রেসিং যোগ করে, এবং Datadog একইসাথে ক্লায়েন্ট এবং সার্ভার উভয় ক্ষেত্রেই অনুরোধের কর্মক্ষমতা ট্র্যাক করতে APM-এর সাথে সংহত হয়।
Grafana Loki — লগের জন্য অপটিমাইজ করা Elasticsearch-এর একটি বিকল্প। Loki ডিফল্টরূপে বার্তা সামগ্রী ইনডেক্স করে না বরং ফিল্টারিংয়ের জন্য লেবেল ব্যবহার করে। এটি সংরক্ষণে উল্লেখযোগ্যভাবে সস্তা এবং ফিল্ডের একটি নির্দিষ্ট সেটে কোয়েরির জন্য দ্রুততর।
// Swift Logger এর মাধ্যমে JSON-এ স্ট্রাকচার্ড লগিং
struct StructuredLog {
let event: String
let attributes: [String: Any]
let level: String
func serialize() -> String {
var base = "event=\(event) level=\(level)"
for (key, value) in attributes {
base += " \(key)=\(value)"
}
return base
}
}
স্ট্রাকচার্ড লগিংয়ের প্রথম নিয়ম: প্রত্যেকটি বার্তায় অনুরোধ বা সেশন শনাক্তকারী থাকতে হবে। প্রসঙ্গ ছাড়া, একটি পৃথক লগ অকেজো — এটি নির্ধারণ করা অসম্ভব যে এটি কোন ব্যবহারকারী বা অনুরোধের সাথে সম্পর্কিত। সেশন শুরুতে correlation ID যোগ করুন এবং এটি অ্যাপ্লিকেশনের সমস্ত স্তরের মাধ্যমে পাস করুন।
দ্বিতীয় নিয়ম: ফিল্ড টাইপিং. সংখ্যাসূচক ফিল্ড (duration_ms, status_code, retry_count) সংখ্যা হিসাবে পাঠানো উচিত, স্ট্রিং হিসাবে নয়। Elasticsearch এবং অনুরূপ সিস্টেম সংখ্যা এবং স্ট্রিং আলাদাভাবে ইনডেক্স করে: সংখ্যাগুলিতে এগ্রিগেশন (গড়, মধ্যমা, পার্সেন্টাইল) প্রয়োগ করা যেতে পারে, স্ট্রিংগুলি পূর্ণ-পাঠ্য অনুসন্ধান সমর্থন করে। ভুল টাইপিং বিশ্লেষণাত্মক ড্যাশবোর্ড তৈরির ক্ষমতা কেড়ে নেয়।
তৃতীয় নিয়ম: নেস্টেড অবজেক্ট এড়িয়ে চলুন. 2 স্তরের বেশি গভীরতা বিশিষ্ট JSON লগ ফিল্টার এবং ভিজুয়ালাইজ করা কঠিন। {"user": {"name": "Alice", "role": "admin"}} এর পরিবর্তে, সমতল কী ব্যবহার করুন: user_name=Alice user_role=admin।
// Timber + logfmt এর মাধ্যমে Android-এ স্ট্রাকচার্ড লগিং
class StructuredTree : Timber.Tree() {
override fun log(priority: Int, tag: String?,
message: String?, t: Throwable?) {
val level = priorityToLevel(priority)
val logfmt = "level=$level tag=$tag message=$message"
sendToRemote(logfmt)
}
}
প্রতিটি স্ট্রাকচার্ড বার্তার জন্য ন্যূনতম ফিল্ড সেট: ISO 8601-এ timestamp, level (debug/info/warn/error/fatal), logger (মডিউল বা ক্লাসের নাম), message (ইভেন্টের মানব-পাঠযোগ্য বিবরণ)। অতিরিক্ত: correlation_id, user_id (যদি জানা থাকে), version (অ্যাপ সংস্করণ), platform (iOS/Android), environment (dev/staging/prod)।
correlation_id ছাড়া, স্ট্রাকচার্ড লগগুলি অসংযুক্ত রেকর্ডের সংগ্রহে পরিণত হয় যেগুলি একটি ব্যবহারকারী পরিস্থিতিতে লিঙ্ক করা যায় না। প্রতিটি অ্যাপ্লিকেশন লঞ্চে UUID তৈরি করুন এবং এটি সমস্ত সেশন লগে যোগ করুন। বাস্তবে, correlation_id সমস্ত স্তরের মাধ্যমে পাঠানো উচিত: UI ইভেন্ট থেকে নেটওয়ার্ক অনুরোধ এবং ব্যাকগ্রাউন্ড টাস্ক পর্যন্ত — অন্যথায় কিছু লগ প্রসঙ্গ ছাড়াই থাকবে এবং বিশ্লেষণে অংশ নেবে না। এন্ড-টু-এন্ড ট্র্যাকিংয়ের সাথে, একটি একক UUID ব্যবহারকারীর যাত্রার সম্পূর্ণ চিত্র সংগ্রহ করতে দেয়।
iOS-এ, স্ট্রাকচার্ড লগিং os_log-এর উপরে একটি র্যাপারের মাধ্যমে বাস্তবায়ন করা যেতে পারে যা ফিল্ডগুলিকে logfmt ফর্ম্যাটে সিরিয়ালাইজ করে। Android-এ, একটি কাস্টম Tree সহ Timber-এর মাধ্যমে যা সার্ভারে পাঠানোর আগে বার্তাগুলিকে JSON বা logfmt-এ রূপান্তরিত করে।
import OSLog
struct StructuredLogger {
let subsystem: String
let category: String
func log(level: OSLogType,
event: String,
context: [String: Any]) {
let oslogger = Logger(
subsystem: subsystem,
category: category
)
let fields = context.map {
"\($0.key)=\($0.value)"
}.joined(separator: " ")
oslogger.log(level: level,
"\(event) \(fields)")
}
}
স্ট্রাকচার্ড এবং টেক্সট লগের মধ্যে পছন্দ প্রকল্পের পর্যায়ে নির্ভর করে। প্রাথমিক উন্নয়ন পর্যায়ে, টেক্সট লগ সহজ এবং দ্রুততর — ডেভেলপার অতিরিক্ত র্যাপার ছাড়াই সরাসরি বার্তা লেখে। কিন্তু একবার প্রকল্প একটি দল বা একটি সার্ভারের সীমা অতিক্রম করলে, স্ট্রাকচার্ড লগ বাধ্যতামূলক হয়ে যায়।
| মানদণ্ড | টেক্সট লগ | স্ট্রাকচার্ড লগ |
|---|---|---|
| পাঠযোগ্যতা | কনসোলে উচ্চ | মধ্যম (pretty-print প্রয়োজন) |
| অনুসন্ধান | সাবস্ট্রিং দ্বারা grep | ফিল্ড এবং মান দ্বারা কোয়েরি |
| এগ্রিগেশন | সমর্থিত নয় | গড়, মধ্যমা, পার্সেন্টাইল |
| সংহতকরণ | পার্সিং প্রয়োজন | ELK/Loki/Datadog-এ নেটিভ |
| সংরক্ষণের আকার | ছোট (মেটাডেটা ছাড়া) | বড় (ফিল্ড + মান) |
প্রায়শই জিজ্ঞাসিত প্রশ্ন
সার্ভারে পাঠানোর জন্য, JSON ব্যবহার করুন — এটি Firebase Crashlytics, Sentry এবং Datadog দ্বারা নেটিভভাবে সমর্থিত। Xcode বা Android Studio লগে স্থানীয়ভাবে দেখার জন্য, logfmt ব্যবহার করুন — এটি আরও কমপ্যাক্ট এবং ফর্ম্যাটিং ছাড়াই পড়া যায়।
হ্যাঁ, ক্লায়েন্টে স্ট্রাকচার্ড লগ প্রতিটি ক্র্যাশ রিপোর্টে প্রসঙ্গ যোগ করার অনুমতি দেয়: OS সংস্করণ, নেটওয়ার্ক অবস্থা, ব্যবহারকারীর শেষ কার্যক্রম। স্ট্রাকচার্ড breadcrumbs ছাড়া, একটি ক্র্যাশ রিপোর্টে ব্যবহারকারীর পরিস্থিতি ছাড়াই শুধুমাত্র কল স্ট্যাক থাকে।
Logfmt আরও কমপ্যাক্ট (30–50% কম আকার) এবং টার্মিনালে পড়তে সহজ। JSON নেস্টেড অবজেক্ট এবং অ্যারে সমর্থন করে তবে উদ্ধৃতি এস্কেপিং প্রয়োজন। পছন্দ অবকাঠামোর উপর নির্ভর করে: ELK-এর জন্য — JSON, কনসোলে দেখার জন্য — logfmt।
অ্যাপ্লিকেশন লঞ্চে UUID-এর একটি উদাহরণ তৈরি করুন, এটি সিঙ্গলটন বা DI কন্টেইনারে সংরক্ষণ করুন এবং কনস্ট্রাক্টরের মাধ্যমে সমস্ত লগারে পাস করুন। বিকল্প — Kotlin করুটিনে থ্রেড-লোকাল বা Continuation Local Storage ব্যবহার করুন।
করা যেতে পারে, তবে সুপারিশ করা হয় না — মিশ্রিত করলে স্বয়ংক্রিয় ইনডেক্সিংয়ের ক্ষমতা হারিয়ে যায়। যদি কিছু লগ টেক্সট-ভিত্তিক হয়, তবে সেগুলিকে রেগুলার এক্সপ্রেশন দিয়ে পার্স করতে হবে, যা অনুসন্ধানের কর্মক্ষমতা এবং নির্ভরযোগ্যতা হ্রাস করে। সমস্ত লগকে স্ট্রাকচার্ড ফর্ম্যাটে মাইগ্রেট করা ভাল।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন