ฉันใช้docker logs [container-name]
เพื่อดูบันทึกของภาชนะที่เฉพาะเจาะจง
มีวิธีหรูหราในการล้างบันทึกเหล่านี้หรือไม่
ฉันใช้docker logs [container-name]
เพื่อดูบันทึกของภาชนะที่เฉพาะเจาะจง
มีวิธีหรูหราในการล้างบันทึกเหล่านี้หรือไม่
คำตอบ:
จากคำถามนี้มีหนึ่งซับไลน์ที่คุณสามารถรัน:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
หรือมีคำสั่ง truncate ที่คล้ายกัน:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
ฉันไม่ได้เป็นแฟนตัวยงของทั้งคู่เพราะพวกเขาแก้ไขไฟล์ของ Docker โดยตรง การลบบันทึกภายนอกอาจเกิดขึ้นในขณะที่นักเทียบท่ากำลังเขียนข้อมูลที่จัดรูปแบบ json ไปยังไฟล์ส่งผลให้เกิดบรรทัดบางส่วนและทำลายความสามารถในการอ่านบันทึกใด ๆ จากdocker logs
CLI
แต่คุณสามารถให้ Docker หมุนบันทึกให้คุณโดยอัตโนมัติ สิ่งนี้ทำกับแฟล็กเพิ่มเติมไปยัง dockerd หากคุณใช้ไดรเวอร์การบันทึก JSONดีฟอลต์:
dockerd ... --log-opt max-size=10m --log-opt max-file=3
คุณสามารถตั้งค่านี้เป็นส่วนหนึ่งของไฟล์daemon.jsonของคุณแทนการแก้ไขสคริปต์เริ่มต้นของคุณ:
{
"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 จะใช้ไวยากรณ์ไบนารีที่เร็วขึ้นและเล็กลง สิ่งนี้อนุญาตให้คุณเก็บบันทึกเพิ่มเติมในไฟล์ขนาดเดียวกัน รายการ daemon.json สำหรับที่ดูเหมือนว่า:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
ข้อเสียของไดรเวอร์ท้องถิ่นคือ parsers / forwarders ภายนอกที่ขึ้นอยู่กับการเข้าถึงโดยตรงไปยังบันทึก json จะไม่ทำงานอีกต่อไป ดังนั้นหากคุณใช้เครื่องมือเช่น filebeat เพื่อส่งไปยัง Elastic หรือตัวส่งต่อสากลของ Splunk ฉันจะหลีกเลี่ยงไดรเวอร์ "local"
ฉันมีอีกเล็กน้อยเกี่ยวกับเรื่องนี้ในของฉันเคล็ดลับและเทคนิคการนำเสนอ
service docker restart
ซึ่งในตัวเองไม่ได้ทำงาน ต้องสร้างแบรนด์ภาชนะใหม่ก่อนจึงจะมีผลบังคับใช้ เช่นการนำขึ้นภาชนะเก่าไม่ได้ใช้การบันทึกใหม่
echo -n > ...
ยังดีกว่าจะเป็น อย่างไรก็ตามฉันต้องการควบคุมบันทึกของฉันได้มากขึ้น ตัวอย่างเช่นหลังจากการเริ่มต้นใหม่นักเทียบท่าเขียนฉันชอบที่จะมีกลไกในการทำบางสิ่งบางอย่างกับบันทึกที่เก็บรักษาไว้
ใช้:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
คุณอาจต้อง sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
อ้าง Jeff S. วิธีล้างบันทึกอย่างถูกต้องสำหรับคอนเทนเนอร์ Docker อย่างไร
การอ้างอิง: การตัดทอนไฟล์ในขณะที่กำลังใช้งานอยู่ (Linux)
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 สำหรับ Windows และ Mac และอื่น ๆ ด้วยเช่นกันคุณสามารถใช้ตัวเลือกหางได้ ตัวอย่างเช่น:
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"
คุณสามารถตั้งค่า logrotate เพื่อล้างบันทึกเป็นระยะ
ไฟล์ตัวอย่างใน /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
VM ที่เซิร์ฟเวอร์เป็นโฮสต์สำหรับคอนเทนเนอร์นักเทียบท่าทั้งหมดภายใต้ Docker4Mac คำสั่งที่เราเรียกใช้นั้นเป็นtruncate -s0 $LOGPATH
คำตอบที่ไม่คุ้นเคยกับ Mac
หากคุณกำลังใช้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'
คุณไม่สามารถทำได้โดยตรงผ่านคำสั่ง Docker
คุณสามารถ จำกัด ขนาดของบันทึกหรือใช้สคริปต์เพื่อลบบันทึกที่เกี่ยวข้องกับคอนเทนเนอร์ คุณสามารถค้นหาตัวอย่างสคริปต์ได้ที่นี่ (อ่านจากด้านล่าง): คุณสมบัติ: ความสามารถในการล้างประวัติบันทึก # 1083
ตรวจสอบส่วนการบันทึกของการอ้างอิงไฟล์นักเทียบท่าซึ่งคุณสามารถระบุตัวเลือก (เช่นการหมุนบันทึกและขีด จำกัด ขนาดบันทึก) สำหรับไดรเวอร์การบันทึกบางตัว
ในฐานะผู้ใช้รูทพยายามรันสิ่งต่อไปนี้:
> /var/lib/docker/containers/*/*-json.log
หรือ
cat /dev/null > /var/lib/docker/containers/*/*-json.log
หรือ
echo "" > /var/lib/docker/containers/*/*-json.log
บนเซิร์ฟเวอร์ 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>`
ฉันชอบสิ่งนี้ (จากโซลูชันด้านบน):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
อย่างไรก็ตามฉันใช้หลาย ๆ ระบบ (เช่น Ubuntu 18.x Bionic) ซึ่งเส้นทางนี้ใช้งานไม่ได้ตามที่คาดไว้ นักเทียบท่าถูกติดตั้งผ่าน Snap ดังนั้นเส้นทางไปยังภาชนะบรรจุจึงมีลักษณะดังนี้
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
คุณสามารถจัดหาพารามิเตอร์ log-opts ใน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 (James Quigley)
"5"
มันทำงานได้ การ10m
ทำงานโดยไม่ต้องพูดถึงอย่างแน่นอน
ผู้ใช้ Docker for Mac นี่คือวิธีแก้ไข:
ค้นหาเส้นทางของไฟล์บันทึกโดย:
$ docker inspect | grep log
SSH ลงในเครื่องนักเทียบท่า (หากชื่อdefault
ไม่ได้ให้เรียกใช้docker-machine ls
เพื่อค้นหา):
$ docker-machine ssh default
เปลี่ยนเป็นผู้ใช้รูท ( ข้อมูลอ้างอิง ):
$ sudo -i
ลบเนื้อหาไฟล์บันทึก:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
เพื่อใส่เปลือก sh ในภาชนะ อย่างไรก็ตามคอนเทนเนอร์จำนวนมากไม่ได้ทำให้sudo
คำสั่งพร้อมใช้งานโดยปริยาย
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"