2016-12-14 13 views
19

Tôi muốn chuyển hướng tất cả nhật ký của vùng chứa docker đến tệp nhật ký duy nhất để phân tích chúng. Tôi đã thửcách chuyển hướng nhật ký docker sang một tệp?

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

nhưng điều này cho phép đăng nhập vào hai tệp khác nhau. Tôi đã thử

docker logs container > /tmp/stdout.log 

nhưng nó không hoạt động.

Trả lời

28

Không cần phải chuyển hướng nhật ký.

Docker theo nhật ký lưu trữ mặc định thành một tệp nhật ký. Để kiểm tra lệnh chạy đường dẫn tệp nhật ký:

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

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

Mở tệp nhật ký đó và phân tích.

nếu bạn chuyển hướng nhật ký thì bạn sẽ chỉ nhận nhật ký trước khi chuyển hướng. bạn sẽ không thể xem nhật ký trực tiếp.

EDIT:

Để xem các bản ghi trực tiếp bạn có thể chạy dưới lệnh

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

Lưu ý:

log này tập tin /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log sẽ được tạo ra chỉ khi các bản ghi tạo Docker nếu có không có nhật ký nào thì tệp này sẽ không có ở đó. nó tương tự như đôi khi nếu chúng ta chạy lệnh docker logs containername và nó không trả về gì cả. Trong trường hợp đó, tệp này sẽ không có sẵn.

+0

'tail -f \ 'Docker kiểm tra --format = '{{LogPath}.}' Myapp \' '- nó thực sự là JSON – Adam

+0

nó sẽ thất bại nếu tập tin đó không có. có nghĩa là nếu docker không tạo ra bất kỳ nhật ký nào thì tệp này sẽ không được tạo. nhưng nếu docker tạo ra các bản ghi thì lệnh này là tốt để xem các bản ghi trực tiếp. cảm ơn Adam. thêm nó vào câu trả lời của tôi để giúp đỡ người khác. –

29

Làm thế nào về tùy chọn này:

docker logs contaiername >& logs/myFile.log

Tôi hy vọng điều này có thể giúp ai đó.

rất hữu ích đối với tôi.

+0

Nếu tôi không sai, lệnh này về cơ bản sẽ sao chép tất cả nhật ký từ khi vùng chứa được bắt đầu hiển thị cho myFile.logs. Đúng.? –

+0

@SAndrew về cơ bản có! nhưng phiên bản mới của Docker có thể thay đổi. tốt hơn để xem 'docker logs --help' để chắc chắn –

4

đó làm việc cho tôi:

docker logs <options> containername >& logs/myFile.log

+0

Bạn đã đăng câu trả lời này sau khi tôi lol –

+0

Sao chép câu trả lời bên dưới và có thể cần phải được xóa. – toddcscar

1

Giả sử rằng bạn có nhiều container và bạn muốn tổng hợp các bản ghi vào một tập tin duy nhất, bạn cần phải sử dụng một số aggregator log như fluentd. fluentd được hỗ trợ như trình điều khiển ghi nhật ký cho các vùng chứa docker.

Vì vậy, trong Docker-soạn, bạn cần phải xác định người lái xe khai thác gỗ

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

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

Bước thứ hai sẽ được cập nhật conf fluentd để phục vụ các bản ghi cho cả hai dịch vụ 1 và vụ 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> 

Trong cấu hình này, chúng tôi yêu cầu các bản ghi được ghi vào một tệp duy nhất cho đường dẫn này
/fluentd/log/service/service.*.log

và bước thứ ba là chạy fluentd tùy chỉnh sẽ bắt đầu ghi nhật ký vào tệp.

Đây là link for step by step instructions

Bit Long, nhưng cách chính xác kể từ khi bạn có được kiểm soát tốt hơn các file log con đường vv và nó hoạt động tốt trong Docker Swarm quá.

1

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

Giải thích:

  • -f (ví dụ: --follow): viết tất cả các bản ghi đang tồn tại và tiếp tục (sau) đăng tất cả những gì xảy ra tiếp theo.
  • Có khả năng bạn muốn chạy phương thức đó dưới nền, như vậy là &.
  • Bạn có thể tách ra và stderr bởi: > output.log 2> error.log
Các vấn đề liên quan