Tôi sử dụng docker logs [container-name]
để xem nhật ký của một container cụ thể.
Có một cách thanh lịch để xóa các bản ghi này?
Tôi sử dụng docker logs [container-name]
để xem nhật ký của một container cụ thể.
Có một cách thanh lịch để xóa các bản ghi này?
Câu trả lời:
Từ câu hỏi này, có một lớp lót mà bạn có thể chạy:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
hoặc có lệnh cắt ngắn tương tự:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Tôi không phải là một fan hâm mộ lớn của một trong hai người vì họ sửa đổi trực tiếp các tệp của Docker. Việc xóa nhật ký bên ngoài có thể xảy ra trong khi docker đang ghi dữ liệu được định dạng json vào tệp, dẫn đến một dòng và phá vỡ khả năng đọc bất kỳ nhật ký nào từ docker logs
cli.
Thay vào đó, bạn có thể để Docker tự động xoay vòng các bản ghi cho bạn. Điều này được thực hiện với các cờ bổ sung cho dockerd nếu bạn đang sử dụng trình điều khiển ghi nhật ký JSON mặc định :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Bạn cũng có thể đặt đây là một phần của tệp daemon.json thay vì sửa đổi tập lệnh khởi động:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Các tùy chọn này cần được cấu hình với quyền truy cập root. Đảm bảo chạy systemctl reload docker
sau khi thay đổi tệp này để áp dụng các cài đặt. Cài đặt này sau đó sẽ là mặc định cho bất kỳ vùng chứa mới được tạo. Lưu ý, các container hiện có cần phải được xóa và tạo lại để nhận các giới hạn nhật ký mới.
Các tùy chọn nhật ký tương tự có thể được chuyển đến các vùng chứa riêng lẻ để ghi đè các giá trị mặc định này, cho phép bạn lưu nhiều hơn hoặc ít hơn các bản ghi trên các thùng chứa riêng lẻ. Từ docker run
đây trông như:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
hoặc trong tệp soạn thảo:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
Để tiết kiệm không gian bổ sung, bạn có thể chuyển từ trình điều khiển nhật ký json sang trình điều khiển nhật ký "cục bộ". Nó có cùng tùy chọn kích thước tối đa và tệp tối đa, nhưng thay vì lưu trữ trong json, nó sử dụng cú pháp nhị phân nhanh hơn và nhỏ hơn. Điều này cho phép bạn lưu trữ nhiều nhật ký hơn trong cùng một tệp có kích thước. Mục daemon.json cho đó trông giống như:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Nhược điểm của trình điều khiển cục bộ là trình phân tích / chuyển tiếp nhật ký bên ngoài phụ thuộc vào quyền truy cập trực tiếp vào nhật ký json sẽ không còn hoạt động. Vì vậy, nếu bạn sử dụng một công cụ như filebeat để gửi tới công cụ chuyển tiếp phổ biến của Splunk hoặc Splunk, tôi sẽ tránh trình điều khiển "cục bộ".
Tôi đã có thêm một chút về điều này trong bài thuyết trình Mẹo và Thủ thuật của tôi .
service docker restart
cái mà bản thân nó không hoạt động. Cũng phải tạo thương hiệu cho các container mới trước khi nó có hiệu lực. tức là chỉ đưa lên các container cũ không áp dụng ghi nhật ký mới
echo -n > ...
. Dù sao, tôi muốn có thể kiểm soát nhiều hơn các bản ghi của tôi. Ví dụ, sau khi khởi động lại docker-compose , tôi rất thích có cơ chế để làm một cái gì đó với các bản ghi được bảo quản.
Sử dụng:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Bạn có thể cần sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
tham chiếu Jeff S. Làm thế nào để xóa nhật ký đúng cách cho container Docker?
Tham khảo: Cắt bớt một tập tin trong khi nó đang được sử dụng (Linux)
containers
không có sẵn nếu không.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- làm việc cho tôi
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
Trên Docker cho Windows và Mac, và có lẽ những người khác cũng vậy, có thể sử dụng tùy chọn đuôi. Ví dụ:
docker logs -f --tail 100
Theo cách này, chỉ có 100 dòng cuối cùng được hiển thị và trước tiên bạn không phải cuộn qua 1M dòng ...
(Và do đó, xóa nhật ký có lẽ không cần thiết)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, chỉ lấy tổng số kích thước của các bản ghisudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Bạn có thể thiết lập logrotate để xóa nhật ký định kỳ.
Tệp ví dụ trong /etc/logrotate.d/docker-logs
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
? tập tin /etc/logrotate.d/docker-logs
không tồn tại, tôi phải tạo ra nó?
"log-opts"
như được hiển thị bởi BMitch)
Docker4Mac, một giải pháp năm 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
Dòng đầu tiên có đường dẫn tệp nhật ký, tương tự như câu trả lời được chấp nhận.
Dòng thứ hai sử dụng nsenter
cho phép bạn chạy các lệnh trong xhyve
VM mà máy chủ là máy chủ lưu trữ cho tất cả các bộ chứa docker trong Docker4Mac. Lệnh chúng tôi chạy là quen thuộc truncate -s0 $LOGPATH
từ các câu trả lời không phải của Mac.
Nếu bạn đang sử dụng docker-compose
, dòng đầu tiên sẽ trở thành:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
và <service>
là tên dịch vụ từ docker-compose.yml
tập tin của bạn .
Cảm ơn https://github.com/justincormack/nsenter1 cho nsenter
mánh khóe.
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'
Bạn không thể làm điều này trực tiếp thông qua lệnh Docker.
Bạn có thể giới hạn kích thước của nhật ký hoặc sử dụng tập lệnh để xóa các nhật ký liên quan đến vùng chứa. Bạn có thể tìm thấy các ví dụ về tập lệnh tại đây (đọc từ dưới lên): Tính năng: Khả năng xóa lịch sử nhật ký # 1083
Kiểm tra phần ghi nhật ký của tham chiếu tệp soạn thảo docker, nơi bạn có thể chỉ định các tùy chọn (chẳng hạn như xoay vòng nhật ký và giới hạn kích thước nhật ký) cho một số trình điều khiển ghi nhật ký.
Là người dùng root , hãy thử chạy như sau:
> /var/lib/docker/containers/*/*-json.log
hoặc là
cat /dev/null > /var/lib/docker/containers/*/*-json.log
hoặc là
echo "" > /var/lib/docker/containers/*/*-json.log
Trên các máy chủ Ubuntu của tôi ngay cả khi sudo tôi sẽ nhận được Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
Nhưng việc kết hợp các docker kiểm tra và cắt ngắn các câu trả lời đã có hiệu quả:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
Tôi thích cái này hơn (từ các giải pháp ở trên):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Tuy nhiên, tôi đang chạy một số hệ thống (ví dụ Ubuntu 18.x Bionic), nơi đường dẫn này không hoạt động như mong đợi. Docker được cài đặt thông qua Snap, vì vậy đường dẫn đến container giống như:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Bạn cũng có thể cung cấp các tham số log-opts trên docker run
dòng lệnh, như sau:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
hoặc trong một docker-compose.yml như thế này
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Tín dụng: https://medium.com/@Quigley_Ja/rotating-docker-logs-keep-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"
nó hoạt động. Các 10m
công việc mà không trích dẫn thực sự.
Docker cho người dùng Mac, đây là giải pháp:
Tìm đường dẫn tệp nhật ký bằng cách:
$ docker inspect | grep log
SSH vào máy docker (giả sử tên là default
, nếu không, hãy chạy docker-machine ls
để tìm hiểu):
$ docker-machine ssh default
Thay đổi thành người dùng root ( tham khảo ):
$ sudo -i
Xóa nội dung tệp nhật ký:
$ echo "" > log_file_path_from_step1
docker exec -it default sh
để nhập vỏ sh trong một container. Tuy nhiên, nhiều container không hoàn toàn làm cho sudo
lệnh có sẵn.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"