Có nginx access_log và error_log đăng nhập vào STDOUT và STDERR của quy trình chính


136

Có cách nào để có nhật ký quy trình chính vào STDOUT STDERR thay vì vào một tệp không?

Có vẻ như bạn chỉ có thể truyền một filepath cho lệnh access_log:

access_log  /var/log/nginx/access.log

Và tương tự với error_log:

error_log /var/log/nginx/error.log

Tôi hiểu rằng điều này đơn giản có thể không phải là một tính năng của nginx, tôi sẽ quan tâm đến một giải pháp ngắn gọn sử dụng đuôi chẳng hạn. Mặc dù tốt hơn là nó xuất phát từ quá trình tổng thể bởi vì tôi đang chạy nginx ở nền trước.


14
Sử dụng Nginx bên trong một Docker container? Kiểm tra câu trả lời này .
czerasz

Câu trả lời được chấp nhận (Patrick's) hoạt động cho hình ảnh Nginx Docker chính thức (hub.docker.com/_/nginx).
Farshid T

Câu trả lời:


197

Chỉnh sửa: có vẻ như nginx hiện hỗ trợ error_log stderr;như được đề cập trong câu trả lời của Anon .

Bạn có thể gửi nhật ký đến /dev/stdout. Trong nginx.conf:

daemon off;
error_log /dev/stdout info;

http {
  access_log /dev/stdout;
  ...
}

chỉnh sửa: Có thể cần chạy ln -sf / Proc / self / fd / dev / nếu sử dụng chạy một số container nhất định, sau đó sử dụng /dev/fd/1hoặc/dev/fd/2


2
Khi tôi cố gắng thực hiện việc này, tôi gặp lỗi sau: 2014/07/29 10:19:09 [nổi] 13742 # 0: open () "/ dev / stdout" không thành công (13: Quyền bị từ chối)
Jon Tirsen

1
Jon, bạn đang trên hệ thống nào? Trên hệ thống của tôi, / dev / stdout là symlink có thể đọc được trên thế giới đến / dev / fd / 1 được sở hữu và đọc + có thể ghi bởi người dùng của tôi.
Patrick

1
Tôi thấy điều này thất bại ENXIOkhi thiết bị xuất chuẩn được mở vào ổ cắm chứ không phải là tệp. Có một vé hạt nhân ngược dòng chỉ ra rằng điều này là có chủ ý và theo ý định: bugzilla.kernel.org/show_orms.cgi?id=1360 - do đó, trong khi một số trường hợp, câu trả lời này là đủ trong phạm vi có thể thất bại.
Charles Duffy

1
Mất một vài giờ về điều này mà không có bất kỳ thành công. Đã thử thay đổi mọi thứ (chế độ daemon, người dùng, phiên bản nginx, v.v.). Nó không làm việc cho tôi. "" "open () "/ dev / stderr" thất bại (6: Không có thiết bị như vậy hoặc địa chỉ)" "" (vấn đề tương tự với thiết bị xuất chuẩn, nhưng nginx nên sản lượng để stderrtheo tài liệu)
Ivan Kleshnin

1
Trong một docker, bạn có thể bị từ chối nếu quy trình của bạn không chạy bằng root trong container. Có một bản sửa lỗi cho phiên bản tiếp theo.
Dobes Vandermeer

54

Nếu câu hỏi liên quan đến docker ... hình ảnh docker nginx chính thức thực hiện điều này bằng cách tạo liên kết mềm hướng tới stdout / stderr

RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log

REF: https://microbadger.com/images/nginx


5
Câu trả lời này hầu hết là chính xác, nhưng thật đáng buồn là không phải đối với các hình ảnh trên núi cao (xem github.com/nginxinc/docker-nginx/blob/master/urdy/alpine/iêu ), chỉ dành cho những người khác như jessie sử dụng tuyên bố này. Nếu bạn là người dùng trên núi cao, chỉ cần tạo Dockerfile của riêng bạn với FROM nginx:alpine RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log CMD ["nginx-debug", "-g", "daemon off;"]
jonashackt 15/03/18

1
Câu trả lời của Patrick hoạt động đối với hình ảnh nginx chính thức ( hub.docker.com/_/nginx ), cả hai cơ sở debian (mới nhất) và alpine.
Farshid T

Liên kết REF của bạn dường như đã chết.
peedee

@jonashackt Tôi đã sử dụng hình ảnh trên núi cao và tôi thấy nó cũng được đăng nhập vào thiết bị xuất chuẩn
Qiulang

Nhấp vào một phiên bản ( hub.docker.com/_/nginx ) để xem tệp docker với dòng đã nói ở trên (đâu đó trước dòng 100).
qräbnö

24
Syntax: error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
Default:    
error_log logs/error.log error;
Context:    main, http, stream, server, location

http://nginx.org/en/docs/ngx_core_module.html#error_log

Không sử dụng: /dev/stderr Điều này sẽ phá vỡ thiết lập của bạn nếu bạn sẽ sử dụng systemd-nspawn.


5

Khi chạy Nginx trong bộ chứa Docker, hãy lưu ý rằng âm lượng được gắn trên thư mục nhật ký sẽ đánh bại mục đích tạo liên kết mềm giữa các tệp nhật ký và thiết bị xuất chuẩn / stderr trong Dockerfile của bạn, như được mô tả trong câu trả lời của @Boeboe .

Trong trường hợp đó, bạn có thể tạo liên kết mềm trong điểm nhập cảnh của mình (được thực hiện sau khi âm lượng được gắn kết) hoặc hoàn toàn không sử dụng âm lượng (ví dụ: khi nhật ký đã được thu thập bởi hệ thống ghi nhật ký trung tâm).


3

Trong hình ảnh docker của PHP-FPM, tôi đã thấy cách tiếp cận như vậy:

# cat /usr/local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2

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

1

Đối với mục đích gỡ lỗi:

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"

Cho một mục đích cổ điển

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"

Yêu cầu

Trong khung máy chủ trên tệp cấu hình

access_log /dev/stdout;
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.