Cách nhận php-fpm để đăng nhập vào thiết bị xuất chuẩn / stderr khi chạy trong bộ chứa docker


18

Tôi có php-fpm trong bộ chứa docker và trong phần Dockerfilechỉnh sửa tệp cấu hình fpm ( /etc/php5/fpm/pool.d/www.conf) để thiết lập nhật ký truy cập để truy cập /var/log/fpm-access.logvà nhật ký lỗi sẽ chuyển đến /var/log/fpm-php.www.log:

# Do some php-fpm config
#  Redirect worker stdout and stderr into main error log
#  Activate the fpm access log
#  Enable display errors
#  Enable the error log
RUN sed -i '/^;catch_workers_output/ccatch_workers_output = yes' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;access.log/caccess.log = /var/log/fpm-access.log' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_flag\[display_errors\]/cphp_flag[display_errors] = off' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_admin_value\[error_log\]/cphp_admin_value[error_log] = /var/log/fpm-php.www.log' /etc/php5/fpm/pool.d/www.conf && \
    sed -i '/^;php_admin_flag\[log_errors\]/cphp_admin_flag[log_errors] = on' /etc/php5/fpm/pool.d/www.conf

Điều này hoạt động tốt - tôi có thể lấy một cái vỏ vào thùng chứa để xem nhật ký. Nhưng ... nó không phải là thực hành tốt nhất.

Vấn đề là khi tôi cố gắng sử dụng trình thu thập nhật ký docker - Tôi cần php-fpm để đăng nhập vào thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn để docker có thể bắt chúng và cung cấp cho chúng docker logslệnh.

Tôi đã cố gắng thực hiện điều này trong Dockerfile(đó là một ý tưởng tôi đã sao chép từ hình ảnh docker nginx chính thức ):

# Redirect fpm logs to stdout and stderr so they are forwarded to the docker log collector
RUN ln -sf /dev/stdout /var/log/fpm-access.log && \
    ln -sf /dev/stderr /var/log/fpm-php.www.log

Điều này không hoạt động - không thấy nhật ký truy cập docker logs- Tôi đang cố gắng tìm hiểu tại sao? Có ai khác sử dụng fpm trong docker quản lý để đăng nhập làm việc với trình thu thập nhật ký docker không?

Câu trả lời:


24

Ok, cách để làm điều này là gửi lỗi và nhật ký truy cập đến địa chỉ sau:

/proc/self/fd/2

Trong php5-fpm.logadd:

access.log = /proc/self/fd/2
error_log = /proc/self/fd/2

Có thể có /dev/stdin ~ /dev/fd/0 ~ /proc/self/fd/0, /dev/stdout/dev/stderrcác biến thể. Có thể dễ nhớ hơn để sử dụng /dev/stdin.
CMCDragonkai

1
Có một lỗi trong câu trả lời - đó là "access_log" chứ không phải "access.log"
rfay 27/03/18

2
Dường như đó là access.log: github.com/docker-l
Library / php / blog / W

13

Lưu ý rằng cấu hình được nướng trong fpm cho phiên bản mới nhất của hình ảnh docker fpm PHP chính thức ghi vào các luồng tiêu chuẩn:

error_log = /proc/self/fd/2

...

; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2

Cảm ơn, điều đó thật thú vị. Tôi không biết rằng bây giờ có một hình ảnh chính thức
Tom

1
Những hình ảnh docker mà bạn đang đề cập đến? Tôi đã chạy php: 7-fpm và dường như không có lỗi đăng nhập stderr.
Derek

1

Nhật ký PHP-FPM sẽ chỉ xuất hiện trong STDERR - vì vậy bạn có thể liên kết tượng trưng fpm.logđến /dev/stderrnếu bạn muốn.

ln -sf /dev/stderr /var/log/fpm-access.log
ln -sf /dev/stderr /var/log/fpm-error.log

4
Giải pháp này đã được đưa ra trong câu hỏi và người hỏi nói rằng nó không hoạt động. Có lẽ bạn có thể chỉ định làm thế nào anh ta có thể tải nó trong dockerfile của mình để làm cho nó hoạt động đúng hoặc các chẩn đoán khác mà anh ta có thể thực hiện trên container của mình?
Andrew Domaszek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.