এই নির্দেশিকাটির লক্ষ্য হল আপনাকে মৌলিক অন্তর্দৃষ্টি এবং অনুশীলনগুলি দিয়ে সজ্জিত করা যাতে আপনি আপনার পরিষেবাগুলিকে আরও কার্যকরভাবে নিরীক্ষণ এবং সমস্যা সমাধান করতে পারেন।
অ্যাপ্লিকেশন বিকাশে, লগিং প্রায়ই উপেক্ষা করা হয়, তবে এটি একটি শক্তিশালী এবং পর্যবেক্ষণযোগ্য সিস্টেম তৈরির একটি গুরুত্বপূর্ণ উপাদান। সঠিক লগিং অনুশীলনগুলি আপনার অ্যাপ্লিকেশনটির দৃশ্যমানতা বাড়াতে পারে, এর অভ্যন্তরীণ কাজগুলি সম্পর্কে আপনার বোঝার গভীরতা এবং সামগ্রিক অ্যাপ্লিকেশন স্বাস্থ্যের উন্নতি করতে পারে।
আপনার অ্যাপ্লিকেশনের এন্ট্রি পয়েন্টগুলিতে ডিফল্ট লগিং প্রক্রিয়া অন্তর্ভুক্ত করা অত্যন্ত উপকারী। এই স্বয়ংক্রিয় লগিং প্রয়োজনীয় মিথস্ক্রিয়া ক্যাপচার করতে পারে এবং সম্ভাব্যভাবে এন্ট্রি পয়েন্টের আর্গুমেন্ট অন্তর্ভুক্ত করতে পারে। যাইহোক, সতর্ক থাকা অত্যন্ত গুরুত্বপূর্ণ কারণ পাসওয়ার্ডের মতো সংবেদনশীল তথ্য লগ করা গোপনীয়তা এবং নিরাপত্তা ঝুঁকির কারণ হতে পারে।
আপনার অ্যাপ্লিকেশানের প্রতিটি উল্লেখযোগ্য পদক্ষেপ অবশ্যই একটি লগ এন্ট্রি তৈরি করবে, বিশেষ করে সেই ক্রিয়াগুলি যা এর অবস্থা পরিবর্তন করে। এই সম্পূর্ণ লগিং পদ্ধতিটি আপনার অ্যাপ্লিকেশনের স্বাস্থ্য এবং কার্যকারিতা সম্পর্কে একটি স্বচ্ছ দৃষ্টিভঙ্গি প্রদান করে সমস্যাগুলি উদ্ভূত হলে দ্রুত সনাক্তকরণ এবং সমাধানের চাবিকাঠি। লগিং এ ধরনের অধ্যবসায় সহজ নির্ণয় এবং রক্ষণাবেক্ষণ নিশ্চিত করে।
আপনার অ্যাপ্লিকেশন দ্বারা উত্পন্ন বিপুল পরিমাণ ডেটা পরিচালনা এবং ব্যাখ্যা করার জন্য উপযুক্ত লগ স্তরগুলি গ্রহণ করা অত্যন্ত গুরুত্বপূর্ণ৷ লগগুলিকে তাদের তীব্রতা এবং প্রাসঙ্গিকতার উপর ভিত্তি করে শ্রেণীবদ্ধ করে, আপনি নিশ্চিত করেন যে গুরুতর সমস্যাগুলি অবিলম্বে চিহ্নিত করা হয়েছে এবং সমাধান করা হয়েছে, যখন কম জরুরী তথ্য আপনার পর্যবেক্ষণ প্রচেষ্টাকে অপ্রতিরোধ্য না করে অ্যাক্সেসযোগ্য থাকে।
লগ লেভেলগুলি কার্যকরভাবে ব্যবহার করার জন্য নীচে একটি নির্দেশিকা রয়েছে:
স্তর | বর্ণনা ও উদাহরণ | গৃহীত ব্যবহার | গ্রহনযোগ্য না |
---|---|---|---|
| মারাত্মক ঘটনা যা সিস্টেম অপারেশন বন্ধ করে দেয়। যেমন, ডাটাবেস সংযোগ হারিয়েছে | জটিল সিস্টেম ত্রুটি | অ-গুরুত্বপূর্ণ ত্রুটি, যেমন ব্যর্থ ব্যবহারকারী লগইন প্রচেষ্টা |
| একটি সমস্যা আছে কিন্তু সিস্টেম এক্সিকিউশন চালিয়ে যেতে পারে এবং অনুরোধকৃত অপারেশন সম্পূর্ণ করতে পারে | সম্ভাব্য সমস্যা যা সমস্যার সৃষ্টি করে | রুটিন অবস্থা পরিবর্তন |
| সাধারণ অ্যাপ্লিকেশন ফাংশনগুলির অন্তর্দৃষ্টি, যেমন ব্যবহারকারীর অ্যাকাউন্ট তৈরি বা ডেটা লেখা৷ | রাজ্যের পরিবর্তন | পরিবর্তন ছাড়া শুধুমাত্র পঠন অপারেশন |
| বিস্তারিত ডায়াগনস্টিক তথ্য, যেমন প্রক্রিয়া শুরু/শেষ | লগিং প্রক্রিয়ার পদক্ষেপগুলি সিস্টেমের অবস্থা পরিবর্তন করে না | রুটিন অবস্থা পরিবর্তন বা উচ্চ ফ্রিকোয়েন্সি অপারেশন |
| পদ্ধতি এন্ট্রি/প্রস্থান সহ সবচেয়ে বিস্তারিত স্তর | একটি প্রক্রিয়ার প্রবাহ এবং বিবরণ বোঝা | সংবেদনশীল তথ্য লগিং |
ডেটাবেস ডেটাতে লগ ইনফরমেশন লিঙ্ক করার জন্য সরাসরি জড়িত সত্তার আইডি সহ আপনার অ্যাপ্লিকেশনে লগিং ক্রিয়াকলাপগুলি গুরুত্বপূর্ণ। একটি শ্রেণীবিন্যাস পদ্ধতি আপনাকে আপনার অ্যাপ্লিকেশনের একটি নির্দিষ্ট অংশের সাথে সংযুক্ত সমস্ত লগগুলিকে তাদের মূল গোষ্ঠী বা বিভাগের সাথে লিঙ্ক করে দ্রুত খুঁজে পেতে সহায়তা করে৷
উদাহরণস্বরূপ, একটি বার্তা পাঠাতে ব্যর্থ হলে শুধুমাত্র একটি চ্যাটের আইডি লগ করার পরিবর্তে, আপনার চ্যাট রুমের আইডি এবং এটি যে কোম্পানির অন্তর্ভুক্ত সেটিও লগ করা উচিত৷ এইভাবে, আপনি আরও প্রসঙ্গ লাভ করতে পারবেন এবং সমস্যাটির বিস্তৃত প্রভাব দেখতে পাবেন।
Failed to send the message - chat=$roomId, chatRoomId=chatRoomId, company=$companyId
শ্রেণীবিন্যাস পদ্ধতি ব্যবহার করার সময় উত্পাদন লগগুলি কীভাবে দেখতে পারে তার একটি উদাহরণ নীচে দেওয়া হল:
সমস্ত দল জুড়ে লগ ফরম্যাট মানক করা আপনার লগগুলি পড়া এবং বোঝার জন্য অনেক সহজ করে তুলতে পারে। এখানে বিবেচনা করার জন্য কিছু প্রমিত উপসর্গ রয়েছে:
লগ বার্তার মূল অংশ থেকে পরিবর্তনশীল নাম এবং মানগুলি আলাদা করা বেশ কয়েকটি সুবিধা দেয়:
Log message - valueName=value
এখানে আলোচনা করা সর্বোত্তম অনুশীলনগুলি অনুসরণ করে সুগঠিত লগ এন্ট্রিগুলির উদাহরণ রয়েছে:
2023-10-05 14:32:01 [INFO] Successful login attempt - userId=24543, teamId=1321312 2023-10-05 14:33:17 [WARN] Failed login attempt - userId=536435, teamId=1321312
এই উদাহরণগুলি দেখায়:
প্রস্তাবিত অনুশীলনগুলি ব্যবহার করার সময় উত্পাদন লগগুলি কীভাবে দেখতে পারে তার একটি উদাহরণ নীচে দেওয়া হল:
একটি নির্দিষ্ট ব্যবহারকারীর ক্রিয়াকলাপের সাথে কার্যকরভাবে লগগুলিকে যুক্ত করার জন্য, একটি traceId
অন্তর্ভুক্ত করা অত্যন্ত গুরুত্বপূর্ণ বা এটিকে আপনার লগগুলিতে correlationId
বলা হয়৷ আইডিটি সেই এন্ট্রি পয়েন্ট দ্বারা ট্রিগার হওয়া যুক্তি দ্বারা উত্পন্ন সমস্ত লগ জুড়ে সামঞ্জস্যপূর্ণ থাকা উচিত, ঘটনাগুলির ক্রমটির একটি স্পষ্ট দৃষ্টিভঙ্গি প্রদান করে।
Datadog-এর মতো কিছু পর্যবেক্ষণ পরিষেবা বাক্সের বাইরে লগ গ্রুপিং প্রদান করে, এটি নিজেও প্রয়োগ করা যেতে পারে। স্প্রিং ব্যবহার করে একটি কোটলিন অ্যাপ্লিকেশনে, আপনি একটি হ্যান্ডলারইন্টারসেপ্টর ব্যবহার করে REST অনুরোধের জন্য একটি ট্রেস আইডি প্রয়োগ করতে পারেন।
@Component class TraceIdInterceptor : HandlerInterceptor { companion object { private const val TRACE_ID = "traceId" } override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean { val traceId = UUID.randomUUID().toString() MDC.put(TRACE_ID, traceId) return true } override fun afterCompletion(request: HttpServletRequest, response: HttpServletResponse, handler: Any, ex: Exception?) { MDC.remove(TRACE_ID) } }
এই ইন্টারসেপ্টর প্রতিটি অনুরোধের জন্য একটি অনন্য traceId
তৈরি করে, অনুরোধের শুরুতে এটি এমডিসি-তে যোগ করে এবং অনুরোধ সম্পূর্ণ হওয়ার পরে এটি সরিয়ে দেয়।
এই ধরনের লগ একত্রীকরণ বাস্তবায়ন করা আপনাকে নীচের উদাহরণের মতো লগ ফিল্টার করতে সক্ষম করবে
অনেক সিস্টেমে, সংস্থাগুলি তাদের প্রাথমিক শনাক্তকারী হিসাবে UUID
বা Long
আইডি ব্যবহার করতে পারে, যখন কিছু সিস্টেম বিভিন্ন উদ্দেশ্যে উভয় ধরনের ID ব্যবহার করতে পারে। লগিং উদ্দেশ্যে প্রতিটি প্রকারের প্রভাব বোঝা একটি জ্ঞাত পছন্দ করার জন্য অত্যন্ত গুরুত্বপূর্ণ।
এখানে বিবেচনা করার বিষয়গুলির একটি ভাঙ্গন রয়েছে:
পঠনযোগ্যতা: Long
আইডিগুলি পড়া সহজ এবং যথেষ্ট ছোট, বিশেষ করে যদি সেগুলি Long
পরিসরের উচ্চ প্রান্তে না হয়।
অনন্য মান: UUID
আইডিগুলি পুরো সিস্টেম জুড়ে স্বতন্ত্রতা প্রদান করে, যা আপনাকে আইডি সংঘর্ষের সমস্যার সম্মুখীন না হয়ে একটি আইডি ব্যবহার করে লগ অনুসন্ধান করতে সক্ষম করে। এখানে সংঘর্ষের অর্থ হল সম্পর্কহীন ডিবি টেবিল থেকে 2টি সত্তার একই Long
আইডি থাকার সম্ভাবনা রয়েছে।
সিস্টেমের সীমাবদ্ধতা : যেসব সিস্টেমে এন্টিটি আইডি হিসেবে লং প্রাইমারি কী ব্যবহার করা হয়, সেখানে একটি এলোমেলো UUID
আইডি যোগ করা সাধারণত সহজ, UUID
এন্টিটি আইডি সহ বিতরণ করা সিস্টেমে লগিং করার জন্য বিশেষ করে Long
আইডি থাকা চ্যালেঞ্জিং বা ব্যয়বহুল হতে পারে।
বিদ্যমান লগ: লগগুলিতে ব্যবহৃত আইডিগুলির প্রকারের মধ্যে সামঞ্জস্যতা গুরুত্বপূর্ণ, অন্তত প্রতি সত্তার জন্য। যদি সিস্টেমটি ইতিমধ্যেই কিছু সত্তার জন্য লগ তৈরি করে এবং আপনি সেগুলিকে পরিবর্তন করার কথা বিবেচনা না করেন, তাহলে সত্তাটিকে শনাক্ত করার জন্য ইতিমধ্যে ব্যবহৃত প্রকারের সাথে লেগে থাকা ভাল৷ উভয় আইডি লগ করা একটি ট্রানজিশন পিরিয়ডের সময় বিবেচনা করা যেতে পারে, তবে স্থায়ীভাবে একাধিক আইডি থাকা অপ্রয়োজনীয়ভাবে লগগুলিকে বিশৃঙ্খল করবে।
কার্যকর পরিষেবা পর্যবেক্ষণের জন্য সঠিক লগিং অনুশীলন অপরিহার্য। ব্যাপক লগিং, উপযুক্ত লগ লেভেল, ট্রেস আইডি, এবং স্ট্যান্ডার্ডাইজড লগ ফরম্যাটগুলি অন্তর্ভুক্ত করে, আপনি আপনার অ্যাপ্লিকেশনগুলি নিরীক্ষণ এবং সমস্যা সমাধানের আপনার ক্ষমতা উল্লেখযোগ্যভাবে উন্নত করতে পারেন। এই অনুশীলনগুলি আপনার লগগুলির স্বচ্ছতা এবং ধারাবাহিকতাকে উন্নত করে, সমস্যাগুলি দ্রুত নির্ণয় এবং সমাধান করা সহজ করে তোলে।
এই পোস্টটি পড়ার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ!