Skip to content
VDS · Docker اور کنٹینرز

کنٹینر لاگز اور انہیں کیسے نہ کھوئیں

Docker لاگز کہاں محفوظ ہوتے ہیں، ان کا حجم کیسے محدود کریں تاکہ ڈسک نہ بھریں، اور کیا کریں تاکہ ریکارڈ کنٹینر دوبارہ بننے پر بھی محفوظ رہیں۔

اپ ڈیٹ 23 اگست، 2026

جب کوئی سروس ڈاؤن ہو جائے تو لاگ ہی واحد سچا ذریعہ ہوتا ہے۔ بطور ڈیفالٹ Docker اسے کنٹینر کے ساتھ ہی ایک فائل میں لکھتا ہے اور اس کے سائز پر کوئی حد نہیں لگاتا: ایک زیادہ لکھنے والی ایپلیکیشن ایک ہفتے میں پوری ڈسک بھر سکتی ہے۔

کیسے پڑھیں

docker logs -f --tail 100 <container>
docker compose logs -f app
docker compose logs --since 30m --timestamps app
docker logs <container> 2>&1 | grep -i error | tail -50

یاد رکھنے کے قابل: Docker وہی دکھاتا ہے جو ایپلیکیشن معیاری آؤٹ پٹ اور معیاری ایرر پر لکھتی ہے۔ اگر یہ کنٹینر کے اندر اپنی فائل میں لکھتی ہے تو docker logs کچھ نہیں دکھائے گا — آپ کو لاگ اندر تلاش کرنا ہوگا یا آؤٹ پٹ کو ری ڈائریکٹ کرنا ہوگا۔

docker compose exec app ls -la /var/log

ابھی سائز پر حد لگائیں

تمام کنٹینرز کے لیے گلوبل سیٹنگ /etc/docker/daemon.json ہے:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "3" }
}
sudo systemctl restart docker

یہ سیٹنگ ری اسٹارٹ کے بعد بنائے گئے کنٹینرز پر لاگو ہوتی ہے۔ چل رہے کنٹینرز کو دوبارہ بنانا ہوگا۔ ایک سروس کے لیے، یہی چیز Compose میں بھی جاتی ہے:

services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "20m"
        max-file: "3"

نتیجہ: بے حد بڑھوتری کے بجائے فی سروس 60 MB سے زیادہ نہیں۔

موجودہ سائز اس سے پہلے چیک کریں کہ وہ آپ کو حیران کر دے: sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail. آپ rm سے چل رہی فائل کو تراش نہیں سکتے — جب تک Docker ڈسکرپٹر رکھے ہوئے ہے جگہ خالی نہیں ہوتی۔ صحیح طریقہ: کنٹینر دوبارہ بنائیں یا sudo truncate -s 0 <file> چلائیں۔

لاگز کو کنٹینر سے آگے زندہ رکھیں

لاگ فائل کنٹینر کے ساتھ ہی ڈیلیٹ ہو جاتی ہے۔ اگر تاریخ اہم ہے تو اسے سسٹم جرنل کے حوالے کر دیں:

logging:
  driver: journald
  options:
    tag: "myapp"
journalctl -t myapp -n 200 --since today
journalctl -t myapp -p err --since "2 days ago"

journald ریکارڈز خود بخود روٹیٹ کرتا ہے اور /etc/systemd/journald.conf میں SystemMaxUse سیٹنگ سے محدود ہوتا ہے۔ یہ کتنی جگہ لیتا ہے یہ چیک کرنے کے لیے: journalctl --disk-usage۔

ایک ساتھ کئی سروسز کے لیے سب کچھ ایک جگہ جمع کرنا زیادہ آسان ہے — مثلاً ایک مخصوص کلیکٹر کنٹینر کے ساتھ جو ریکارڈز کو دن کے حساب سے فائلوں میں محفوظ کرتا ہے۔ لیکن journald سے شروع کریں: یہ پہلے سے موجود ہے اور کچھ خرچ نہیں کرتا۔

آؤٹیج ڈیبگ کرتے وقت کیا دیکھیں

  1. کریش سے پہلے کی آخری 200 لائنیں: docker logs --tail 200 <container>۔
  2. ایگزٹ کوڈ: docker inspect -f '{{.State.ExitCode}} {{.State.OOMKilled}}' <container>۔ کوڈ 137 اور OOMKilled میں true کا مطلب ہے کہ کرنل نے پروسیس کو میموری ختم ہونے کی وجہ سے مار دیا — دیکھیں ریسورس لِمٹس۔
  3. مشین کا سسٹم لاگ: sudo dmesg -T | tail -50 آؤٹ آف میموری کِلز اور ڈسک ایررز دکھائے گا۔

عام غلطیاں

  • ڈسک لاگز سے بھر گئی اور ہر سروس ڈاؤن ہو گئی۔ Docker انسٹال کرنے کے فوراً بعد سائز پر حد لگانا لازمی ہے۔
  • پہلے سے ڈیلیٹ شدہ کنٹینر کا لاگ دیکھنا۔ docker compose down کے بعد وہ ختم ہو چکا ہوتا ہے۔ ریکارڈز پہلے سے journald میں جمع کریں۔
  • لاگ میں سیکرٹس۔ ایپلیکیشنز پاس ورڈز کے ساتھ کنکشن اسٹرنگز پرنٹ کرنا پسند کرتی ہیں۔ مشین تک رسائی رکھنے والا کوئی بھی شخص لاگ پڑھ سکتا ہے۔
  • ٹیکسٹ کنسول میں ایرر تلاش کرنا۔ یہ ہمیشہ 80×24 ہوتا ہے اور لمبی لائنیں کٹ جاتی ہیں۔ لاگز پڑھنے کے لیے SSH یا ”Screen“ کنسول زیادہ آسان ہے۔