2015-08-18 30 views
5

Hiện tại chúng tôi đang chuyển hướng tất cả nhật ký ứng dụng đến stdout từ nhiều vùng chứa và thu thập/var/log/message qua rsyslog trong máy chủ tới ngăn xếp ELK.Giải pháp ghi nhật ký cho nhiều thùng chứa đang chạy trên cùng một máy chủ

Tất cả nhật ký vùng chứa docker hiển thị dưới dạng docker/xxxxxxxx, chúng tôi không thể biết ứng dụng nào là nhật ký này, dù sao chúng tôi có thể dễ dàng phân biệt các ứng dụng từ nhiều nhật ký container từ docker stdout?

+1

Bản ghi 'docker-compose -f'có thể đủ, nếu đó là cách bạn bắt đầu chúng –

Trả lời

1

Bạn đã xem xét fluentd chưa? Nó có thể là những gì bạn cần.

+0

Câu hỏi tương tự ở đây, cách chúng tôi có thể cho biết từng loại ứng dụng khác với id vùng chứa? – Tom

+0

Thành thật mà nói tôi chưa bao giờ sử dụng nó, nhưng nghe những điều tốt đẹp về nó. Tôi sợ bạn sẽ phải đào sâu hơn về tài liệu của nó. –

0

Tại sao bạn dựa vào nhật ký/var/log/tin cho nhật ký ứng dụng của mình? Theo tôi, nhật ký ứng dụng của bạn phải độc lập.

Giả sử bạn có một java, ruby, python, nút, ứng dụng golang (Dù), sau đó bạn có thể bơm nhật ký trong vùng chứa vào cái gì đó như /var/log/myapp/myapp.log. Chạy nhật ký của bạn forwarder trong vùng chứa của bạn để chuyển tới tất cả mọi thứ của ELK theo /var/log/myapp/myapp.log

Nói chung, người gửi hàng sẽ hiển thị tên máy chủ là container_id của bạn dựa trên biến số en2 HOSTNAME. Ví dụ:

[[email protected] ~]# env | grep HOSTNAME 
HOSTNAME=1dfab5ea15cd 
[[email protected] ~]# 

Bạn cũng có thể sử dụng giống như Beaver hoặc log-courier để vận chuyển các bản ghi của bạn.

Bạn có thể xoay nhật ký và xóa nhật ký cũ nếu lo ngại về dung lượng đĩa.

Vì vậy, nếu bạn muốn sử dụng lệnh docker logs để chuyển hướng đến STDOUT và STDERR, bạn sẽ yêu cầu ứng dụng viết một bản ghi xác định vùng chứa/ứng dụng. (Container có thể là tên máy chủ một lần nữa) Nhưng bạn có thể chuyển hướng đến /var/log/app/application.log trên máy chủ. Một cái gì đó như:

containerid/<hostname>-application: INFO: <message> 

Đừng nghĩ có bất kỳ cách nào khác ...

Bạn cũng có thể chuyển sang Fluentd thay vì Logstash như một tùy chọn.

+0

Lưu nhật ký vật lý vào vùng chứa không phải là cách thực hành tốt nhất, từ Docker 1.6, chúng tôi có thể xuất tất cả các nhật ký ứng dụng sang thiết bị xuất chuẩn, sau đó máy chủ lưu trữ các bản ghi đó để xử lý tiếp. – Tom

+0

Không hoàn toàn thấy nó theo cách đó, tôi nghĩ rằng thực hành tốt nhất là cho Docker để xác định id container khi chuyển hướng đến STDOUT/STDERR trong các phiên bản trong tương lai. Có vẻ như chưa có. – Rico

8

(Hướng dẫn cho OS X nhưng nên làm việc trong Linux)

Dường như không phải là một cách để làm điều này với một lệnh Docker, tuy nhiên trong bash bạn có thể chạy nhiều lệnh cùng một lúc, và với sed bạn có thể thêm tiền tố với tên vùng chứa của mình.

docker logs -f --tail=30 container1 | sed -e 's/^/[-- container1 --]/' & 
docker logs -f --tail=30 container2 | sed -e 's/^/[-- container2 --]/' & 

Và bạn sẽ thấy đầu ra từ cả hai vùng chứa cùng một lúc.

container1 :: logging line 
container1 :: logging line 
container2 :: logging line 
container2 :: logging line 
container1 :: logging line 
container1 :: logging line 
container2 :: logging line 
container2 :: logging line 

Để đuôi tất cả các container của bạn cùng một lúc:

#!/bin/bash 

names=$(docker ps --format "{{.Names}}") 
echo "tailing $names" 

while read -r name 
do 
    # eval to show container name in jobs list 
    eval "docker logs -f --tail=5 \"$name\" | sed -e \"s/^/[-- $name --] /\" &" 
    # For Ubuntu 16.04 
    #eval "docker logs -f --tail=5 \"$name\" |& sed -e \"s/^/[-- $name --] /\" &" 
done <<< "$names" 

function _exit { 
    echo 
    echo "Stopping tails $(jobs -p | tr '\n' ' ')" 
    echo "..." 

    # Using `sh -c` so that if some have exited, that error will 
    # not prevent further tails from being killed. 
    jobs -p | tr '\n' ' ' | xargs -I % sh -c "kill % || true" 

    echo "Done" 
} 

# On ctrl+c, kill all tails started by this script. 
trap _exit EXIT 

# For Ubuntu 16.04 
#trap _exit INT 

# Don't exit this script until ctrl+c or all tails exit. 
wait 

Và để ngăn chặn chúng chạy fg và sau đó nhấn ctrl+c cho mỗi container.

Cập nhật: Cảm ơn @ Flo-Woo dành cho Ubuntu 16.04 hỗ trợ

+1

cho máy chủ Ubuntu 16.04 của tôi, tôi đã phải thực hiện những thay đổi này và làm việc tốt nhờ. 'eval 'nhật ký docker -f --tail = 5 \" $ name \ "| & sed -e \" s/^/[- $ name -]/\ "&" 'và' trap _exit INT ' –

+1

Tôi cũng đã thêm định nghĩa của trình bao vào đầu tập lệnh nếu không tôi nhận được" chuyển hướng bất ngờ ". '#!/Bin/bash' – Jleuleu

+0

Cuộc gọi tốt @Jleuleu – Nate

Các vấn đề liên quan