マスタープロセスのSTDOUTおよびSTDERRにnginx access_logおよびerror_logログを記録する


136

ファイルではなく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 2016年

承認された回答(Patrick's)は、公式のNginx Dockerイメージ(hub.docker.com/_/nginx)で機能します。
Farshid T 2018

回答:


197

編集:それはngonx error_log stderr;Anonの答えで述べられているように今サポートしているようです。

ログをに送信できます/dev/stdout。でnginx.conf

daemon off;
error_log /dev/stdout info;

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

編集:特定のDockerコンテナを使用している場合は、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 14

1
ENXIOstdoutがファイルではなくソケットに対して開かれていると、これは失敗します。これが意図的で意図的であることを示す上流のカーネルチケットがあります:bugzilla.kernel.org/show_bug.cgi ? id = 1360-したがって、この回答で十分な場合もありますが、可能な範囲を完全にはカバーしていません失敗。
Charles Duffy

1
これで数時間を失いましたが、成功しませんでした。すべてを変更しようとしました(デーモンモード、ユーザー、nginxバージョンなど)。それは私にはうまくいきません。"" "open()" / dev / stderr "failed(6:No stderr
such

1
Docker内で、プロセスがコンテナーのルートとして実行されていない場合、権限が拒否される可能性があります。この問題は次のバージョンで修正される予定です。
Dobes Vandermeer

54

質問がドッカー関連である場合...公式のnginxドッカー画像は、標準出力/標準エラーへのソフトリンクを作成することでこれを行います

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/...)、のような他の人だけのためにジェシーは、このステートメントを使用しません。高山ユーザーyou're場合は、単に使用して独自の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の回答は、debian(最新)および高山ベースの両方の公式nginxイメージ(hub.docker.com/_/nginx)で機能します。
Farshid T 2018

REFリンクが機能していないようです。
受取人

@jonashackt高山の画像を使用したところ、stdoutにも記録されていました
Qiulang

バージョン(hub.docker.com/_/nginx)をクリックして、前述の行(100行目の前の行)を含むdockerファイルを表示します。
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のDockerイメージで、私はそのようなアプローチを見てきました。

# 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.