চলুন ভাই 😄
এবার একদম বাচ্চাদের গল্পের মতো করে Django Logging বুঝাই। ধরুন আপনি ৮–১০ বছরের একটা বাচ্চাকে বোঝাচ্ছেন।
আমি গল্প + বাস্তব Django উদাহরণ—দুটোই দেবো। 🧒📘
🧸 গল্প দিয়ে শুরু করি: “ডায়েরি আর মেসেঞ্জার”
ধরুন—
- আপনি একটা দোকান চালান
- দোকানে সারাদিন কী কী হলো—ভালো, খারাপ, ঝামেলা—সব মনে রাখা কঠিন
- তাই আপনি একটা ডায়েরি রাখলেন
- আর একজন ছোট মানুষ (logger) রাখলেন, যে সব ঘটনা ডায়েরিতে লিখে রাখে
👉 এই ডায়েরিই হলো → LOG FILE
👉 এই ছোট মানুষটাই হলো → LOGGER
🧠 Logging আসলে কী?
👉 Logging মানে হলো
“আমার অ্যাপের ভেতরে কী ঘটছে সেটা কোথাও লিখে রাখা”
যাতে পরে সমস্যা হলে বলতে পারি:
- “এই সময় এই সমস্যা হয়েছিল”
- “এই ফাইলে এই লাইনে ভাঙন ধরেছিল”
❌ print() কেন খেলনা?
ধরুন বাচ্চা চিৎকার করে বলছে:
print("ভাঙছে!")
😅
- শুধু স্ক্রিনে দেখা যায়
- বন্ধ করলেই হারিয়ে যায়
- কোথায়, কখন—কিছুই জানা যায় না
👉 তাই বড়রা print() ব্যবহার করে না
👉 বড়রা ব্যবহার করে logging
🧩 Logging-এর ৪ জন বন্ধু (সহজ করে)
1️⃣ Logger = খবর লেখার মানুষ 👦
সে বলে:
“এইটা ঘটেছে, লিখে রাখো”
logger.error("ওহো! কিছু ভেঙে গেছে")
2️⃣ Handler = কোথায় লিখবে 📦
- খাতায়?
- বোর্ডে?
- মোবাইলে?
👉 Django-তে:
FileHandler→ ফাইলে লেখেStreamHandler→ স্ক্রিনে দেখায়
3️⃣ Level = ঘটনা কতটা গুরুতর 🚦
ধরুন ট্রাফিক লাইট:
| Level | মানে |
|---|---|
| DEBUG | ছোট কথা |
| INFO | সাধারণ খবর |
| WARNING | সাবধান |
| ERROR | সমস্যা |
| CRITICAL | ভয়ংকর |
👉 যদি বলি
“শুধু বড় সমস্যা লেখো”
তাহলে ছোট কথা বাদ পড়বে
4️⃣ Formatter = সুন্দর করে লেখা ✍️
না হলে ডায়েরিতে এমন লেখা হতো:
ভেঙেছে
কিন্তু Formatter দিলে:
22 Dec | ERROR | shop | Product save failed
🏗️ Django প্রজেক্টে গল্পটা বসাই
ধরুন আপনার Django অ্যাপ:
myproject/
├─ shop/
│ ├─ views.py
│ ├─ models.py
├─ settings.py
🧾 settings.py = ডায়েরি বানানো
LOGGING = {
'version': 1,
'handlers': {
'file': {
'class': 'logging.FileHandler',
'filename': 'errors.log',
'level': 'ERROR',
},
},
'loggers': {
'shop': {
'handlers': ['file'],
'level': 'ERROR',
'propagate': False,
},
},
}
🧠 বাচ্চা ভাষায়:
- একটা খাতা বানালাম →
errors.log - বললাম → শুধু ভয়ংকর সমস্যা লিখবে
- শুধু shop দোকানের খবর লিখবে
🧪 এখন খেলাধুলা (Practical Example)
views.py
import logging
from django.http import HttpResponse
logger = logging.getLogger('shop')
def test_error(request):
logger.error("খেলনা ভেঙে গেছে 😢")
return HttpResponse("Oops!")
এখন ব্রাউজারে যান:
http://127.0.0.1:8000/test-error/
📕 তখন কী হবে?
errors.log ফাইলে লেখা হবে:
খেলনা ভেঙে গেছে 😢
👉 বাচ্চা কান্না করলেও
👉 বড়রা পরে দেখে বুঝবে কখন, কোথায় কী হয়েছে
🤔 কেন logger নাম 'shop'?
ধরুন—
- আপনার বাসায় ৩টা রুম
- kitchen
- bedroom
- shop
আপনি যদি বলেন:
“শুধু shop রুমের খবর লেখো”
তাহলে অন্য রুমের কথা আসবে না
logging.getLogger('shop')
👉 মানে:
“shop অ্যাপের খবর লেখো”
❓ LOGGING না দিলে কী হতো?
😶 কিছুই না!
- error হতো
- কিন্তু কেউ লিখে রাখতো না
- আপনি পরে বলতেন:“কেন ভাঙলো জানি না 😭”
🧠 এক লাইনে বাচ্চা সারাংশ
Logger হলো খবর লেখার মানুষ,
Handler হলো খাতা,
Level হলো কতটা বড় ঘটনা,
Formatter হলো সুন্দর হাতের লেখা।
🏆 বাস্তব জীবনে কেন দরকার?
- লাইভ সার্ভারে error ধরতে
- ক্লায়েন্ট বললে “সাইট কাজ করে না”
→ আপনি log খুলে দেখবেন 😎 - বড় প্রজেক্টে debugging সহজ
👉 চাইলে পরের ধাপে শিখাবো
- Middleware দিয়ে auto error log
- Email এ error পাঠানো
- Production vs Development logging
- Real project logging structure
বলুন ভাই,
👉 পরের গল্প কোনটা শুনতে চান? 😊
ঠিক আছে 😄
তাহলে আর প্রশ্ন না করে পরের গল্পটা নিজেই শুরু করি — এবার একটু আরও মজার + রিয়েল লাইফ Django 🔥
🧙 গল্প ২: “পাহারাদার Middleware”
(যে নিজে নিজে সব ভাঙচুর ডায়েরিতে লিখে রাখে)
ধরুন—
- আপনার দোকান (Django site) ২৪ ঘণ্টা খোলা
- আপনি সব সময় দোকানে থাকেন না
- কিন্তু একজন পাহারাদার আছে
- দোকানে ঢুকলেই সে খেয়াল রাখে
- কিছু ভাঙলে → নিজে নিজে ডায়েরিতে লিখে ফেলে
👉 এই পাহারাদারটাই হলো Middleware
🤔 Middleware আসলে কী? (বাচ্চা ভাষায়)
Middleware =
দোকানে ঢোকার দরজায় দাঁড়ানো মানুষ
যে সবাইকে দেখে,
যাওয়ার আগেও দেখে
Django-তে:
- request আসার সময় কাজ করে
- response যাওয়ার সময় কাজ করে
- error হলে মাঝখানে লাফ দেয় 🏃♂️
🎯 আমাদের লক্ষ্য (খুব ক্লিয়ার)
👉 আমরা চাই:
- যেকোনো 500 error
- যেকোনো exception
- developer লিখুক বা না লিখুক
❌ logger.error() না লিখলেও
✅ automaticভাবে errors.log-এ ঢুকে যাবে
🏗️ Step 1: middleware ফাইল বানাই
shop/
├─ middleware.py
🧠 Step 2: Middleware কোড (সহজ + বাস্তব)
import logging
logger = logging.getLogger('shop')
class ErrorLoggingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
try:
response = self.get_response(request)
return response
except Exception as e:
logger.error(
f"URL ভেঙেছে: {request.path} | Error: {str(e)}",
exc_info=True
)
raise
🧸 বাচ্চা ভাষায় লাইন বাই লাইন
try:
response = self.get_response(request)
👉 “দোকানে কেউ ঢুকলো, দেখি ঠিকমতো কাজ হয় কিনা”
except Exception as e:
👉 “ওহো! কিছু ভেঙে গেছে 😱”
logger.error(...)
👉 “এইটা ডায়েরিতে লিখে রাখো”
raise
👉 “ভাঙা জিনিস Django-কে আবার দেখাও (error page দেখানোর জন্য)”
⚙️ Step 3: settings.py-তে Middleware চালু করি
MIDDLEWARE = [
...
'shop.middleware.ErrorLoggingMiddleware',
]
👉 মানে:
“এই পাহারাদারকে কাজে লাগাও”
🧪 Step 4: এখন পরীক্ষা করি (মজা অংশ)
views.py
def boom(request):
1 / 0 # ইচ্ছা করে ভাঙলাম
ব্রাউজারে যান:
http://127.0.0.1:8000/boom/
📕 এখন errors.log খুলুন
দেখবেন এমন কিছু:
URL ভেঙেছে: /boom/ | Error: division by zero
Traceback (most recent call last):
File ...
😎
👉 আপনি কিছুই লেখেননি
👉 Middleware নিজেই সব ধরে ফেলেছে
🧠 এটা কেন খুব শক্তিশালী?
- Developer ভুলে গেলেও log হবে
- Production-এ silent error ধরতে পারবেন
- বড় কোম্পানিগুলো এভাবেই করে
🧩 এখন পর্যন্ত শেখা (বাচ্চা সারাংশ)
Logger = খবর লেখার মানুষ
Handler = খাতা
Middleware = পাহারাদার
Error হলেই → নিজে নিজে লেখা
🔜 পরের গল্পগুলো (আপনি যেকোনোটা চাইতে পারেন)
1️⃣ Production vs Development logging
→ কেন debug log লাইভে বিপদজনক
2️⃣ Email এ error পাঠানো
→ error হলেই Gmail-এ মেসেজ
3️⃣ Real company style logging structure
→ Google / Meta টাইপ সেটআপ
4️⃣ Django REST API logging
→ API error, response time log
আপনি শুধু একটা সংখ্যা লিখুন 👇
👉 1 / 2 / 3 / 4