मैं docker logs [container-name]
एक विशिष्ट कंटेनर के लॉग देखने के लिए उपयोग करता हूं ।
क्या इन लॉग को खाली करने का एक सुंदर तरीका है?
मैं docker logs [container-name]
एक विशिष्ट कंटेनर के लॉग देखने के लिए उपयोग करता हूं ।
क्या इन लॉग को खाली करने का एक सुंदर तरीका है?
जवाबों:
इस प्रश्न से एक-लाइनर है जिसे आप चला सकते हैं:
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"}
}
स्थानीय चालक का नकारात्मक पक्ष बाहरी लॉग पार्सर्स / फारवर्डर है जो सीधे जोंस लॉग तक पहुंच पर निर्भर करता है, अब काम नहीं करेगा। इसलिए यदि आप लोचदार, या स्प्लंक के सार्वभौमिक फारवर्डर को भेजने के लिए फ़ाइलबीट जैसे उपकरण का उपयोग करते हैं, तो मैं "स्थानीय" ड्राइवर से बचूंगा।
मैंने अपने टिप्स और ट्रिक्स प्रस्तुति में इस पर थोड़ा और अधिक पाया है ।
service docker restart
जो अपने आप नहीं हुआ। इसके प्रभावी होने से पहले नए कंटेनरों का निर्माण करना था। यानी सिर्फ पुराने कंटेनरों को लाने से नई लॉगिंग लागू नहीं हुई
echo -n > ...
। वैसे भी, मैं अपने लॉग पर अधिक नियंत्रण रखने में सक्षम होना चाहूंगा। उदाहरण के लिए, डॉकटर-कंपोज़ पुनः आरंभ होने के बाद , मुझे संरक्षित लॉग्स के साथ कुछ करने के लिए तंत्र रखना अच्छा लगेगा।
उपयोग:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
आपको सुडो की आवश्यकता हो सकती है
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
संदर्भ। जेफ एस। एक डॉक कंटेनर के लिए लॉग को ठीक से कैसे साफ़ करें?
containers
अन्यथा उपलब्ध नहीं है।
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- मेरे लिए काम किया
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
विंडोज और मैक के लिए डॉकर पर, और शायद दूसरों को भी, पूंछ विकल्प का उपयोग करना संभव है। उदाहरण के लिए:
docker logs -f --tail 100
इस तरह, केवल अंतिम 100 लाइनें दिखाई गई हैं, और आपके पास 1M लाइनों के माध्यम से स्क्रॉल करने के लिए पहले नहीं है ...
(और इस प्रकार, लॉग हटाना संभवतः अनावश्यक है)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, केवल लॉग के आकार का कुल प्राप्त करने के लिएsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
आप लॉग को समय-समय पर साफ़ करने के लिए लॉगोटेट सेट कर सकते हैं।
/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
मौजूद नहीं है, मुझे इसे बनाना है?
"log-opts"
जैसा कि BMitch द्वारा दिखाया गया है)
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
चाल।
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'
आप इसे सीधे डॉकर कमांड के माध्यम से नहीं कर सकते।
आप या तो लॉग के आकार को सीमित कर सकते हैं, या कंटेनर से संबंधित लॉग को हटाने के लिए स्क्रिप्ट का उपयोग कर सकते हैं। आप यहां स्क्रिप्ट उदाहरण पा सकते हैं (नीचे से पढ़ें): फ़ीचर: लॉग इतिहास # 1083 को साफ़ करने की क्षमता
डॉकटर-कंपोज़ फ़ाइल संदर्भ के लॉगिंग अनुभाग को देखें, जहां आप कुछ लॉगिंग ड्राइवरों के लिए विकल्प (जैसे लॉग रोटेशन और लॉग आकार सीमा) निर्दिष्ट कर सकते हैं।
एक के रूप में जड़ उपयोगकर्ता, निम्नलिखित चलाने का प्रयास:
> /var/lib/docker/containers/*/*-json.log
या
cat /dev/null > /var/lib/docker/containers/*/*-json.log
या
echo "" > /var/lib/docker/containers/*/*-json.log
मैं इसे पसंद करता हूं (ऊपर समाधानों से):
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
आप 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"
), जैसा कि वैश्विक डेमॉन.जॉन फ़ाइल के लिए यहां दिखाया गया है , लेकिन यह डॉकटर-कंपोज़ के लिए समान है। दोनों ही मामलों में, यह केवल नव निर्मित कंटेनरों को प्रभावित करेगा।
"5"
करता हूं: यह काम करता है। 10m
वास्तव में के हवाले से बिना काम करते हैं।
मैक उपयोगकर्ताओं के लिए डॉकर, यहाँ समाधान है:
लॉग फ़ाइल पथ खोजें:
$ docker inspect | grep log
DoH मशीन में SSH (मान लें कि नाम है default
, यदि नहीं, तो docker-machine ls
पता लगाने के लिए दौड़ें ):
$ docker-machine ssh default
रूट उपयोगकर्ता में बदलें ( संदर्भ ) में :
$ sudo -i
लॉग फ़ाइल सामग्री हटाएं:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
एक कंटेनर में एक शेल खोल दर्ज करने के लिए उपयोग कर सकते हैं । हालांकि, कई कंटेनर स्पष्ट रूप से sudo
आदेश को उपलब्ध नहीं कराते हैं ।
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"