एक ही फ़ाइल में डॉकटर लॉग को पुनर्निर्देशित कैसे करें?


110

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

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log

लेकिन यह दो अलग फ़ाइल में लॉग देता है। मैंने पहले ही कोशिश की

docker logs container > /tmp/stdout.log

लेकिन यह काम नहीं करता।

जवाबों:


137

लॉग को पुनर्निर्देशित करने की आवश्यकता नहीं है।

डिफ़ॉल्ट स्टोर द्वारा डॉकर एक लॉग फ़ाइल में लॉग इन करता है। लॉग फ़ाइल पथ रन कमांड की जाँच करने के लिए:

docker inspect --format='{{.LogPath}}' containername

/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log

उस लॉग फ़ाइल को खोलें और विश्लेषण करें।

यदि आप लॉग रीडायरेक्ट करते हैं तो आपको रीडायरेक्ट से पहले केवल लॉग्स मिलेंगे। आप लाइव लॉग नहीं देख पाएंगे।

संपादित करें:

लाइव लॉग देखने के लिए आप नीचे कमांड चला सकते हैं

tail -f `docker inspect --format='{{.LogPath}}' containername`

ध्यान दें:

यह लॉग फाइल /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.logतभी बनेगी जब डॉक जेनरेटिंग लॉग्स होंगे अगर कोई लॉग नहीं है तो यह फाइल नहीं होगी। यह कुछ समय के समान है यदि हम कमांड चलाते हैं docker logs containernameऔर यह कुछ भी नहीं देता है। इस परिदृश्य में यह फ़ाइल उपलब्ध नहीं होगी।


tail -f `docker inspect --format='{{.LogPath}}' myapp`- यह वास्तव में JSON है
एडम

यह विफल हो जाएगा अगर वह फ़ाइल वहाँ नहीं है। इसका मतलब यह है कि यदि डॉकटर कोई लॉग नहीं बनाता है तो यह फाइल नहीं बनेगी। लेकिन अगर डॉकिंग लॉग्स बनाते हैं तो लाइव लॉग देखने के लिए यह कमांड अच्छा है। धन्यवाद एडम। इसे दूसरों की मदद करने के लिए मेरे जवाब में जोड़ दें।
pl_rock

"एक लॉग फ़ाइल में डिफ़ॉल्ट स्टोर लॉग द्वारा डॉक।" - किस संदर्भ में? एक डॉक होस्ट पर चलने वाले सभी कंटेनरों को एक ही फाइल में आउटपुट मिलता है? एक एकल कंटेनर?
क्रिस स्ट्राइकसिनस्की

@ChrisStryczynski Docker प्रति कंटेनर एक लॉग फ़ाइल बनाता है
एड़ी Hernandez

126

इस विकल्प के बारे में कैसे:

docker logs containername >& logs/myFile.log

यह लॉग को रीडायरेक्ट नहीं करेगा जो प्रश्न में पूछा गया था, लेकिन एक विशिष्ट फ़ाइल में एक बार उन्हें कॉपी करें।


यदि मैं गलत नहीं हूं, तो यह कमांड मूल रूप से सभी लॉग को कॉपी करेगा जब कंटेनर को myFile.logs को प्रस्तुत करना शुरू किया गया था। सही।?
एस एंड्रयू

@ और मूल रूप से हाँ! लेकिन डॉकर के नए संस्करण बदल सकते हैं। निश्चित रूप से देखने के docker logs --helpलिए बेहतर है
एड्डी हर्नांडेज़

38

docker logs -f <yourContainer> &> your.log &

स्पष्टीकरण:

  • -f(अर्थात --follow): सभी मौजूदा लॉग्स को लिखते हैं और जारी रखते हैं ( निम्न ) जो कुछ भी आता है उसे लॉगिंग करते हैं।
  • &> मानक आउटपुट और मानक त्रुटि दोनों को पुनर्निर्देशित करता है।
  • संभवतः आप इस विधि को पृष्ठभूमि में चलाना चाहते हैं, इस प्रकार &
  • आप आउटपुट और stderr को अलग कर सकते हैं: > output.log 2> error.log(उपयोग करने के बजाय &>)।

9

अपने डॉकटर कंटेनर से stdout और stderr दोनों को कैप्चर करने के लिए एक सिंगल लॉग फ़ाइल में निम्नलिखित को चलाएँ:

docker logs container > container.log 2>&1

8

यह मानते हुए कि आपके पास कई कंटेनर हैं और आप लॉग को एक फ़ाइल में एकत्रित करना चाहते हैं, आपको फ़्लूल्ड जैसे कुछ लॉग एग्रीगेटर का उपयोग करने की आवश्यकता है। फ्लोकेड डॉकटर कंटेनरों के लिए लॉगिंग ड्राइवर के रूप में समर्थित है।

इसलिए डॉक-कंपोज़ में, आपको लॉगिंग ड्राइवर को परिभाषित करने की आवश्यकता है

  service1:
    image: webapp:0.0.1
    logging:
      driver: "fluentd"
      options:
        tag: service1 

  service2:
        image: myapp:0.0.1
        logging:
          driver: "fluentd"
          options:
            tag: service2

दूसरा चरण सेवा 1 और सेवा 2 दोनों के लिए लॉग को पूरा करने के लिए धाराप्रवाह अद्यतन को अद्यतन करेगा

 <match service1>
   @type copy
   <store>
    @type file
    path /fluentd/log/service/service.*.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%z
  </store>
 </match> 
 <match service2>
    @type copy
   <store>
    @type file
    path /fluentd/log/service/service.*.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%
  </store>
 </match> 

इस कॉन्फिगरेशन में, हम लॉग्स को इस पथ के लिए एक फाइल में लिखे जाने के लिए कह रहे हैं
/fluentd/log/service/service.*.log

और तीसरा चरण होगा स्वनिर्धारित फ्लुएंट को चलाना जो लॉग फाइल करने के लिए लिखना शुरू करेगा।

यहाँ कदम से कदम निर्देश के लिए लिंक है

बिट लॉन्ग, लेकिन सही तरीका है क्योंकि आपको लॉग फाइल पथ आदि पर अधिक नियंत्रण मिलता है और यह डॉकर झुंड में भी अच्छा काम करता है।


1

चूंकि डॉकर हमारे लिए stdout और stderr को मिलाता है, इसलिए हम लॉग आउटपुट को किसी अन्य शेल स्ट्रीम की तरह ट्रीट कर सकते हैं। वर्तमान लॉग को किसी फ़ाइल में पुनर्निर्देशित करने के लिए, पुनर्निर्देशन ऑपरेटर का उपयोग करें

$ docker logs test_container > output.log
docker logs -f test_container > output.log

Stderr और stdout को आउटपुट भेजने के बजाय, अपने एप्लिकेशन के आउटपुट को एक फ़ाइल में रीडायरेक्ट करें और फ़ाइल को कंटेनर के बाहर स्थायी भंडारण के लिए मैप करें।

$ docker logs test_container> /tmp/output.log

डॉकर कमांड लाइन पर रिश्तेदार पथ स्वीकार नहीं करेगा, इसलिए यदि आप एक अलग निर्देशिका का उपयोग करना चाहते हैं, तो आपको पूर्ण पथ का उपयोग करने की आवश्यकता होगी।


1

आप विंडोज पर काम करते हैं और (मेरे जैसे) PowerShell का उपयोग करते हैं, तो आप पर कब्जा करने के लिए निम्न लाइन इस्तेमाल कर सकते हैं stdoutऔर stderr:

 docker logs <containerId> | Out-File 'C:/dev/mylog.txt'

मुझे आशा है कि यह किसी की मदद करता है!


1
सभी कंटेनर लॉग को फ़ाइल में सहेजने के लिए, कंटेनर नाम के आधार पर ...foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
xisket

1

सबसे आसान तरीका है कि मैं इस कमांड टर्मिनल पर है:

docker logs elk > /home/Desktop/output.log

संरचना है:

docker logs <Container Name> > path/filename.log

1

सबसे पहले अपने कंटेनर आईडी की जांच करें

docker ps -a

आप कंटेनर आईडी कॉलम में पहली पंक्ति देख सकते हैं। संभवतः यह "3fd0bfce2806" जैसा दिखता है, फिर इसे शेल में टाइप करें

docker inspect --format='{{.LogPath}}' 3fd0bfce2806

आपको कुछ ऐसा दिखाई देगा

/var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

तब आप इसे देख सकते हैं

cat /var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

यह JSON प्रारूप में होगा, आप त्रुटियों का पता लगाने के लिए टाइमस्टैम्प का उपयोग कर सकते हैं


0

एक निर्दिष्ट निर्देशिका में सभी कंटेनर लॉग को कॉपी करने के लिए बैश स्क्रिप्ट:

#!/usr/bin/env bash

TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in `sudo docker ps --format '{{.Names}}'`;
do
    path=$(sudo docker inspect --format='{{.LogPath}}' $name)
    sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.