마스터 프로세스의 STDOUT 및 STDERR에 nginx access_log 및 error_log 로그가 있음


137

마스터 프로세스가 파일 대신 STDOUT STDERR에 로그하는 방법이 있습니까?

access_log 지시문에만 파일 경로를 전달할 수있는 것 같습니다.

access_log  /var/log/nginx/access.log

error_log도 마찬가지입니다.

error_log /var/log/nginx/error.log

나는 이것이 단순히 nginx의 기능이 아닐 수도 있음을 이해합니다. 예를 들어 꼬리를 사용하는 간결한 솔루션에 관심이 있습니다. 비록 포 그라운드에서 nginx를 실행하고 있기 때문에 마스터 프로세스에서 오는 것이 바람직합니다.


14
Docker 컨테이너 내에서 Nginx를 사용하십니까? 체크 아웃 이 답변을 .
czerasz

허용되는 답변 (Patrick 's)은 ​​공식 Nginx Docker 이미지 (hub.docker.com/_/nginx)에서 작동합니다.
Farshid T

답변:


198

편집 : 이제 Anon의 답변error_log stderr; 에서 언급 한 것처럼 nginx가 지원하는 것 같습니다 .

로 로그를 보낼 수 있습니다 /dev/stdout. 에서 nginx.conf:

daemon off;
error_log /dev/stdout info;

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

편집 : 특정 도커 컨테이너를 사용하는 경우 ln -sf / proc / self / fd / dev / 를 실행해야 할 /dev/fd/1수도 있습니다./dev/fd/2


2
이렇게하면 다음과 같은 오류가 발생합니다. 2014/07/29 10:19:09 [emerg] 13742 # 0 : open () "/ dev / stdout"failed (13 : Permission denied)
Jon Tirsen

1
존, 어떤 시스템을 사용하고 있습니까? 내 시스템에서 / dev / stdout은 / dev / fd / 1에 대한 세계에서 읽을 수있는 심볼릭 링크이며 사용자가 소유하고 읽고 쓸 수 있습니다.
Patrick

1
ENXIOstdout이 파일이 아닌 소켓에 열려있을 때 이것이 실패하는 것을 봅니다 . 업스트림 커널 티켓이 있으며 의도적으로 의도 된 것입니다 : bugzilla.kernel.org/show_bug.cgi?id=1360- 따라서이 답변으로는 충분하지만, 가능한 범위를 완전히 다루지는 않습니다. 실패.
Charles Duffy

1
성공하지 않고 몇 시간을 잃었습니다. 모든 것을 바꾸려고 노력했습니다 (데몬 모드, 사용자, nginx 버전 등). 그것은 나를 위해 작동하지 않습니다. "" "공개 ()"/ 디바이스 / 열려진 "실패 (6 : 이러한 장치 또는 어드레스)"(에 표준 출력과 같은 문제가 있지만 nginx를 출력합니다 "," stderr문서에 따라)
이반 Kleshnin

1
도커 내에서 프로세스가 컨테이너의 루트로 실행되지 않으면 권한이 거부 될 수 있습니다. 다음 버전에서는 이에 대한 수정 사항이 있습니다.
Dobes Vandermeer

54

질문이 도커와 관련이 있다면 ... 공식 nginx 도커 이미지는 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
이 답변은 대부분 정확하지만 슬프게도하지입니다 고산 이미지 (참조 github.com/nginxinc/docker-nginx/blob/master/stable/alpine/... )와 같은 다른 단지에 대한 제시가 이 문을 사용합니까. 알파인 사용자라면 다음과 같이 자신 만의 Dockerfile을 만드십시오. 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

1
Patrick의 답변은 공식 nginx 이미지 ( hub.docker.com/_/nginx ), 데비안 (최신) 및 알파인베이스에서 작동합니다.
Farshid T

REF 링크가 작동하지 않는 것 같습니다.
오줌

@jonashackt 나는 고산 이미지를 사용하고 또한 stdout에 기록 된 것을 발견
Qiulang

버전 ( hub.docker.com/_/nginx )을 클릭 하여 위에서 언급 한 행이있는 도커 파일을 확인하십시오 (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

사용하지 마십시오 : /dev/stderr systemd-nspawn을 사용하려는 경우 설정이 중단됩니다.


5

Docker 컨테이너에서 Nginx를 실행할 때 @Boeboe의 답변에 설명 된 것처럼 로그 디렉토리에 마운트 된 볼륨은 Dockerfile의 로그 파일과 stdout / stderr 사이의 소프트 링크를 만드는 목적을 능가 합니다.

이 경우 진입 점에 소프트 링크를 만들거나 (볼륨을 마운트 한 후 실행) 볼륨을 전혀 사용하지 않을 수 있습니다 (예 : 중앙 로깅 시스템에서 로그를 이미 수집 한 경우).


3

PHP-FPM의 도커 이미지에서 다음과 같은 접근법을 보았습니다.

# 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

디버그 목적으로 :

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

고전적인 목적으로

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

필요

구성 파일의 서버 브래킷 아래

access_log /dev/stdout;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.