डॉकटर कंटेनर के लिए लॉग को ठीक से कैसे साफ़ करें?


210

मैं docker logs [container-name]एक विशिष्ट कंटेनर के लॉग देखने के लिए उपयोग करता हूं ।

क्या इन लॉग को खाली करने का एक सुंदर तरीका है?


14
एक सिडेनोट पर, आप लॉग का आकार प्राप्त कर सकते हैंsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
डैनियल एफ

जवाबों:


251

इस प्रश्न से एक-लाइनर है जिसे आप चला सकते हैं:

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

या इसी तरह की छोटी कमांड है:

truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

मैं उनमें से किसी का भी बड़ा प्रशंसक नहीं हूं क्योंकि वे सीधे डॉकर की फाइलों को संशोधित करते हैं। बाहरी लॉग विलोपन तब हो सकता है, जब डॉक फ़ाइल में जोंस स्वरूपित डेटा लिख ​​रहा है, जिसके परिणामस्वरूप एक आंशिक रेखा है, और docker logsक्ली से किसी भी लॉग को पढ़ने की क्षमता को तोड़ना है ।

इसके बजाय, आप अपने लिए लॉग को स्वचालित रूप से घुमा सकते हैं। यदि आप डिफ़ॉल्ट JSON लॉगिंग ड्राइवर का उपयोग कर रहे हैं तो यह डॉकर्ड के अतिरिक्त झंडे के साथ किया जाता है :

dockerd ... --log-opt max-size=10m --log-opt max-file=3

आप अपनी स्टार्टअप स्क्रिप्ट को संशोधित करने के बजाय इसे अपने डेमन.जॉन फ़ाइल के हिस्से के रूप में भी सेट कर सकते हैं :

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

इन विकल्पों को रूट एक्सेस के साथ कॉन्फ़िगर करने की आवश्यकता है। systemctl reload dockerसेटिंग्स लागू करने के लिए इस फ़ाइल को बदलने के बाद चलाना सुनिश्चित करें । यह सेटिंग किसी भी नए बनाए गए कंटेनर के लिए डिफ़ॉल्ट होगी। ध्यान दें, नई लॉग सीमाएँ प्राप्त करने के लिए मौजूदा कंटेनरों को हटाना और उन्हें फिर से बनाना होगा।


इसी तरह के लॉग विकल्प इन डिफॉल्ट्स को ओवरराइड करने के लिए व्यक्तिगत कंटेनरों को पास किए जा सकते हैं, जिससे आप व्यक्तिगत कंटेनरों पर कम या ज्यादा लॉग्स को बचा सकते हैं। docker runइस तरह से दिखता है:

docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...

या एक रचना फ़ाइल में:

version: '3.7'
services:
  app:
    image: ...
    logging:
      options:
        max-size: "10m"
        max-file: "3"

अतिरिक्त स्थान की बचत के लिए, आप json लॉग ड्राइवर से "स्थानीय" लॉग ड्राइवर पर स्विच कर सकते हैं। यह एक ही अधिकतम-आकार और अधिकतम-फ़ाइल विकल्प लेता है, लेकिन json में भंडारण के बजाय यह एक द्विआधारी वाक्यविन्यास का उपयोग करता है जो तेज और छोटा होता है। यह आपको एक ही आकार की फ़ाइल में अधिक लॉग स्टोर करने की अनुमति देता है। इस तरह दिखता है कि डेमन.जॉन प्रविष्टि:

{
  "log-driver": "local",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

स्थानीय चालक का नकारात्मक पक्ष बाहरी लॉग पार्सर्स / फारवर्डर है जो सीधे जोंस लॉग तक पहुंच पर निर्भर करता है, अब काम नहीं करेगा। इसलिए यदि आप लोचदार, या स्प्लंक के सार्वभौमिक फारवर्डर को भेजने के लिए फ़ाइलबीट जैसे उपकरण का उपयोग करते हैं, तो मैं "स्थानीय" ड्राइवर से बचूंगा।

मैंने अपने टिप्स और ट्रिक्स प्रस्तुति में इस पर थोड़ा और अधिक पाया है ।


6
मैंने ऐसा किया service docker restart जो अपने आप नहीं हुआ। इसके प्रभावी होने से पहले नए कंटेनरों का निर्माण करना था। यानी सिर्फ पुराने कंटेनरों को लाने से नई लॉगिंग लागू नहीं हुई
रोबो_यूके

मैं डॉकर १.१३.१ का उपयोग कर रहा हूं, और 'डॉकटर इंस्पेक्ट --फॉर्मैट =' {{लॉगजीपैथ}} ’<कंटेनर आईडी> 'एक अशक्त स्ट्रिंग (" ") देता है .... लेकिन मुझे अभी भी आउटपुट मिल रहा है' डॉक लॉग <कंटेनर आईडी>?!? वह कहाँ से आ रहा है और मैं इसे कैसे साफ़ करूँ ??
जेडी एलन

@JDAllen 1.13.1 समर्थन से बाहर है। मेरे पास एक प्रणाली नहीं है जो उनके निरीक्षण आउटपुट को देखने के लिए पुरानी है।
बिच

बेहतर अभी तक होगा echo -n > ...। वैसे भी, मैं अपने लॉग पर अधिक नियंत्रण रखने में सक्षम होना चाहूंगा। उदाहरण के लिए, डॉकटर-कंपोज़ पुनः आरंभ होने के बाद , मुझे संरक्षित लॉग्स के साथ कुछ करने के लिए तंत्र रखना अच्छा लगेगा।
नारनौस

2
@AlexisWilke यदि आप डॉकटर को रोकने में सक्षम हैं, तो आप अपने कंटेनर को रोकने में सक्षम हैं। यदि आप बाद में कर सकते हैं, तो कंटेनर को लॉगिंग विकल्पों के साथ फिर से बनाना मेरी सलाह होगी। नए कंटेनर में कोई पुराना लॉग नहीं है, और नए लॉग्स को स्वचालित रूप से रोल किया जाएगा, एक ही समय में शॉर्ट टर्म और लॉन्ग टर्म इश्यू दोनों को हल करेगा।
BMitch

227

उपयोग:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

आपको सुडो की आवश्यकता हो सकती है

sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

संदर्भ। जेफ एस। एक डॉक कंटेनर के लिए लॉग को ठीक से कैसे साफ़ करें?

संदर्भ: इसका उपयोग करते समय किसी फ़ाइल को काटकर (लिनक्स)


4
truncate: '/var/lib/docker/containers/*/*-json.log' को लिखने के लिए नहीं खोल सकते: ऐसी कोई फ़ाइल या निर्देशिका
BTR नायडू

2
@BTRNaidu आपको इसे रूट / सुडो के रूप में चलाना होगा, की सामग्री containersअन्यथा उपलब्ध नहीं है।
स्पाइसन

25
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"- मेरे लिए काम किया
जेफ एस।

7
ऊपर दिए गए दो पेशेवरों की उपेक्षा करें। यदि आप अनिश्चित हैं, तो आप बस "ls /var/lib/docker/containers/*/*-json.log" से देख सकते हैं कि क्या छोटा किया जा रहा है।
डकेटोव जूल

1
लॉगफ़ाइल को खाली करने के बाद, मुझे यह त्रुटि मिलती है:error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
arcol

42

विंडोज और मैक के लिए डॉकर पर, और शायद दूसरों को भी, पूंछ विकल्प का उपयोग करना संभव है। उदाहरण के लिए:

docker logs -f --tail 100

इस तरह, केवल अंतिम 100 लाइनें दिखाई गई हैं, और आपके पास 1M लाइनों के माध्यम से स्क्रॉल करने के लिए पहले नहीं है ...

(और इस प्रकार, लॉग हटाना संभवतः अनावश्यक है)


12
लॉग फ़ाइलों को साफ़ करने और लॉग फ़ाइलों की अंतिम n लाइनों को प्रिंट नहीं करने के लिए विचार है
Youssouf Maiga

41
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

4
लॉग का आकार पाने के लिए sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log", केवल लॉग के आकार का कुल प्राप्त करने के लिएsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
डैनियल एफ

क्या डॉकर्ड / एफ़यूज़ के साथ कोई समस्या है जो घुमाए गए लॉग फ़ाइलों को हटाने के लिए अनभिज्ञ और अक्षम है?
थोरसुमोनर

इस कमांड ने मेरे लिए काम किया जबकि इस एसओ में अन्य कमांड्स ने नहीं किया। अगर यह मायने रखता है, तो मैं डॉक्स संस्करण 18 को CentOS 7
टुंड्रा फ़िज़

27

आप लॉग को समय-समय पर साफ़ करने के लिए लॉगोटेट सेट कर सकते हैं।

/Etc/logrotate.d/docker-logs में उदाहरण फ़ाइल

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

और मैं इसका उपयोग कैसे करूं? इसका उपयोग डिफ़ॉल्ट रूप में किया जाता है docker run? फ़ाइल /etc/logrotate.d/docker-logsमौजूद नहीं है, मुझे इसे बनाना है?
कार्लोस। 19

आपको लॉगोटेट यूटिलिटी को कॉल करना होगा (logrotate <config-file>) और यह आपके कॉन्फ़िगरेशन को पढ़ेगा और क्लीनअप चलाएगा। आप इसे उदाहरण के लिए क्रोन जॉब के रूप में भी सेट कर सकते हैं।
एलेक्सपेंट

यह एक समस्या यह है कि यह ठीक से सिंक्रनाइज़ नहीं किया जा सकता है कि डॉकटर क्या कर रहा है। Docker सुविधा का उपयोग करना शायद अधिक समझदार है। ( "log-opts"जैसा कि BMitch द्वारा दिखाया गया है)
एलेक्सिस विल्के

12

Docker4Mac, 2018 समाधान:

LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH

पहली पंक्ति को लॉग फ़ाइल पथ मिलता है, स्वीकृत उत्तर के समान।

दूसरी पंक्ति का उपयोग करता nsenterहै जो आपको xhyveडॉक 4 एमएसी के तहत सभी डॉक कंटेनर के होस्ट के रूप में वीएम में कमांड चलाने की अनुमति देता है । हम जो कमांड चलाते हैं वह परिचित हैtruncate -s0 $LOGPATH गैर-मैक उत्तरों से है।

यदि आप उपयोग कर रहे हैं docker-compose, तो पहली पंक्ति बन जाती है:

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

और <service>आपकी docker-compose.ymlफ़ाइल से सेवा का नाम है ।

के लिए धन्यवाद https://github.com/justincormack/nsenter1 के लिए nsenterचाल।


4
और सभी कंटेनरों के लॉग को अलग करने के लिए आप शेल वाइल्डकार्ड का उपयोग कर सकते हैं जैसा कि अन्य उत्तरों में दिखाया गया है, इसलिए यह सिर्फ एक कमांड है:docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
ब्रैडेनम

11

आप इसे सीधे डॉकर कमांड के माध्यम से नहीं कर सकते।

आप या तो लॉग के आकार को सीमित कर सकते हैं, या कंटेनर से संबंधित लॉग को हटाने के लिए स्क्रिप्ट का उपयोग कर सकते हैं। आप यहां स्क्रिप्ट उदाहरण पा सकते हैं (नीचे से पढ़ें): फ़ीचर: लॉग इतिहास # 1083 को साफ़ करने की क्षमता

डॉकटर-कंपोज़ फ़ाइल संदर्भ के लॉगिंग अनुभाग को देखें, जहां आप कुछ लॉगिंग ड्राइवरों के लिए विकल्प (जैसे लॉग रोटेशन और लॉग आकार सीमा) निर्दिष्ट कर सकते हैं।


7

एक के रूप में जड़ उपयोगकर्ता, निम्नलिखित चलाने का प्रयास:

>  /var/lib/docker/containers/*/*-json.log

या

cat /dev/null > /var/lib/docker/containers/*/*-json.log

या

echo "" > /var/lib/docker/containers/*/*-json.log

6

मेरे Ubuntu सर्वर पर भी sudo के रूप में मुझे मिलेगा Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory

लेकिन कंघी करने वाले ने निरीक्षण किया और जवाबों को तोड़ दिया:

sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`

2

मैं इसे पसंद करता हूं (ऊपर समाधानों से):

truncate -s 0 /var/lib/docker/containers/*/*-json.log

हालाँकि मैं कई सिस्टम चला रहा हूँ (उदाहरण के लिए Ubuntu 18.x Bionic), जहाँ यह पथ अपेक्षित रूप से काम नहीं करता है। डॉकर स्नैप के माध्यम से स्थापित किया गया है, इसलिए कंटेनरों के लिए रास्ता अधिक है:

truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log

1

आप docker runकमांड लाइन पर लॉग-ऑप्स मापदंडों की आपूर्ति भी कर सकते हैं , जैसे:

docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest

या इस तरह एक docker-compose.yml में

my-app:
image: my-app:latest
logging:
    driver: "json-file"
    options:
        max-file: "5"
        max-size: 10m

क्रेडिट: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (जेम्स क्विगले)


पैरामीटर मानों को उद्धृत किया जाना चाहिए (अर्थात क्रमशः "5"और "10m"), जैसा कि वैश्विक डेमॉन.जॉन फ़ाइल के लिए यहां दिखाया गया है , लेकिन यह डॉकटर-कंपोज़ के लिए समान है। दोनों ही मामलों में, यह केवल नव निर्मित कंटेनरों को प्रभावित करेगा।
एड्रियन डब्ल्यू

@ AdrianW: docker-compose.yml को उद्धरण की आवश्यकता नहीं है। ये पूरी तरह से अलग फ़ाइल स्वरूप हैं। और हाँ, आप सही कह रहे हैं: "docker run" कमांड और docker-compose पैरामीटर केवल नए बनाए गए कंटेनरों को प्रभावित करते हैं - जैसा कि यहां सबसे अधिक मतों के साथ उत्तर के विपरीत है जो केवल पुनः आरंभ करने वाले डैमॉन को प्रभावित करता है और केवल रूट एक्सेस के माध्यम से उपलब्ध है। मेरा उत्तर संपूर्ण डॉकडर प्रक्रिया को फिर से शुरू करने की तुलना में संपादन से कहीं अधिक सरल और अद्यतन मार्ग दिखाने वाला है।
दाग बडसेन

उद्धरण के बिना, मुझे मिलता है: ERROR: ऐप के लिए सेवा ऐप के लिए कंटेनर नहीं बनाया जा सकता: json: गो स्ट्रक्चर फील्ड में लॉग इन नहीं कर सकता। LogConfig. टाइप स्ट्रिंग के LogConfig। यदि मैं इस तरह से उद्धरण "5"करता हूं: यह काम करता है। 10mवास्तव में के हवाले से बिना काम करते हैं।
एड्रियन डब्ल्यू

ऐसा लगता है कि विंडोज के लिए डॉकर और लिनक्स के लिए डॉकर में अंतर है। उत्तरार्द्ध पर, मुझे उद्धरणों में मूल्यों को शामिल करना होगा। पूर्व पर नहीं। दोनों को फिट करने के लिए विवरण अपडेट करें। धन्यवाद, @ एड्रियनडब्ल्यू
डाग बार्डसन

0

मैक उपयोगकर्ताओं के लिए डॉकर, यहाँ समाधान है:

    1. लॉग फ़ाइल पथ खोजें:

      $ docker inspect | grep log

    1. DoH मशीन में SSH (मान लें कि नाम है default, यदि नहीं, तो docker-machine lsपता लगाने के लिए दौड़ें ):

      $ docker-machine ssh default

    1. रूट उपयोगकर्ता में बदलें ( संदर्भ ) में :

      $ sudo -i

    1. लॉग फ़ाइल सामग्री हटाएं:

      $ echo "" > log_file_path_from_step1


2
मैक के लिए डॉकर-मशीन डॉकर के साथ काम नहीं करती है। इसके बजाय आप चला सकते हैं "डोकर रन -ti -v / var / lib / डोकर / कंटेनर: / var / स्थापना centos बैश" फिर "truncate --size 0 /var/inception/08d29a7d469232cfef4456dc6eebcbf313bf01ba73e479520a036150c5ab84de/08d29a7d469232cfef4456dc6eebcbf313bf01ba73e479520a036150c5ab84de-json.log"
जमशीद

आप docker exec -it default shएक कंटेनर में एक शेल खोल दर्ज करने के लिए उपयोग कर सकते हैं । हालांकि, कई कंटेनर स्पष्ट रूप से sudoआदेश को उपलब्ध नहीं कराते हैं ।
दाग बाडसेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.