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 वही दिखाता है जो एप्लिकेशन standard output और standard error पर लिखता है। अगर वह कंटेनर के अंदर अपनी फ़ाइल में लिखता है, तो 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> चलाएँ।

लॉग को कंटेनर के बाद भी बचाए रखें

लॉग फ़ाइल कंटेनर के साथ ही डिलीट हो जाती है। अगर हिस्ट्री मायने रखती है, तो इसे सिस्टम journal को सौंप दें:

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 का मतलब है कि मेमोरी खत्म होने पर कर्नेल ने प्रोसेस को मार दिया — देखें resource limits.
  3. मशीन का सिस्टम लॉग: sudo dmesg -T | tail -50 आउट-ऑफ़-मेमोरी किल और डिस्क एरर दिखाएगा।

आम गलतियाँ

  • लॉग से डिस्क भर गई और हर सर्विस डाउन हो गई। Docker इंस्टॉल करने के ठीक बाद साइज़ कैप करना ज़रूरी है।
  • पहले से डिलीट हो चुके कंटेनर का लॉग देखना। docker compose down के बाद वह चला जाता है। रिकॉर्ड पहले से journald में इकट्ठा करें।
  • लॉग में सीक्रेट। एप्लिकेशन पासवर्ड वाली कनेक्शन स्ट्रिंग प्रिंट करना बहुत पसंद करते हैं। मशीन तक पहुँच रखने वाला कोई भी व्यक्ति लॉग पढ़ सकता है।
  • टेक्स्ट कंसोल में एरर ढूँढना। वह हमेशा 80×24 होता है और लंबी लाइनें कट जाती हैं। लॉग पढ़ने के लिए SSH या “Screen” कंसोल ज़्यादा सुविधाजनक है।