Tenga nginx access_log y error_log log en STDOUT y STDERR del proceso maestro

136

¿Hay alguna manera de tener el registro del proceso maestro en STDOUT STDERR en lugar de en un archivo?

Parece que solo puede pasar una ruta de archivo a la directiva access_log:

access_log  /var/log/nginx/access.log

Y lo mismo ocurre con error_log:

error_log /var/log/nginx/error.log

Entiendo que esto simplemente puede no ser una característica de nginx, me interesaría una solución concisa que use cola, por ejemplo. Sin embargo, es preferible que provenga del proceso maestro porque estoy ejecutando nginx en primer plano.

quinn
fuente
14
¿Usando Nginx dentro de un contenedor Docker? Mira esta respuesta .
czerasz
La respuesta aceptada (Patrick) funciona para las imágenes oficiales de Nginx Docker (hub.docker.com/_/nginx).
Farshid T

Respuestas:

197

Editar: parece que nginx ahora es compatible error_log stderr;como se menciona en la respuesta de Anon .

Puede enviar los registros a /dev/stdout. En nginx.conf:

daemon off;
error_log /dev/stdout info;

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

editar: puede que tenga que ejecutar ln -sf / proc / self / fd / dev / si usa ejecutar ciertos contenedores de acopladores, luego use /dev/fd/1o/dev/fd/2

Patricio
fuente
2
Cuando intento hacer esto me sale el siguiente error: 29/07/2014 10:19:09 [emerg] 13742 # 0: open () "/ dev / stdout" falló (13: Permiso denegado)
Jon Tirsen
1
Jon, ¿en qué sistema estás? En mi sistema, / dev / stdout es un enlace simbólico legible a nivel mundial a / dev / fd / 1, que es propiedad de mi usuario y de lectura + escritura.
Patrick
1
Veo que esto falla ENXIOcuando stdout está abierto a un socket en lugar de a un archivo. Hay un ticket de kernel ascendente que indica que esto es deliberado y por intención: bugzilla.kernel.org/show_bug.cgi?id=1360 , por lo tanto, aunque esta respuesta es suficiente en algunos casos, no cubre completamente el rango de posibles fallas
Charles Duffy
1
Perdí unas horas en esto sin ningún éxito. Intenté cambiar todo (modos demonio, usuarios, versiones nginx, etc.). Simplemente no funciona para mí. "" "open ()" / dev / stderr "falló (6: No stderr
existe
1
Dentro de una ventana acoplable, puede obtener permiso denegado si su proceso no se ejecuta como raíz en el contenedor. Hay una solución para esto en la próxima versión.
Dobes Vandermeer
54

Si la pregunta está relacionada con la ventana acoplable ... las imágenes oficiales de la ventana acoplable nginx hacen esto haciendo enlaces suaves hacia 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

Boeboe
fuente
55
Esta respuesta es mayormente correcta, pero lamentablemente no para las imágenes alpinas (vea github.com/nginxinc/docker-nginx/blob/master/stable/alpine/… ), solo para los demás como jessie use esta declaración. Si eres un usuario alpino, solo crea tu propio Dockerfile con 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
La respuesta de Patrick funciona para imágenes oficiales de nginx ( hub.docker.com/_/nginx ), tanto debian (más reciente) como bases alpinas.
Farshid T
Su enlace REF parece estar muerto.
peedee
@jonashackt Utilicé imágenes alpinas y descubrí que también estaba registrado en stdout
Qiulang,
Haga clic en una versión ( hub.docker.com/_/nginx ) para ver el archivo acoplable con la línea mencionada anteriormente (en algún lugar antes de la línea 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

No use: /dev/stderr esto interrumpirá su configuración si va a usar systemd-nspawn.

Luego
fuente
5

Cuando ejecute Nginx en un contenedor Docker, tenga en cuenta que un volumen montado sobre el directorio de registro anula el propósito de crear un enlace suave entre los archivos de registro y stdout / stderr en su Dockerfile, como se describe en la respuesta de @Boeboe .

En ese caso, puede crear el enlace suave en su punto de entrada (ejecutado después de que se montan los volúmenes) o no usar un volumen (por ejemplo, cuando un sistema de registro central ya ha recopilado los registros).

vengativo
fuente
3

En la imagen de Docker de PHP-FPM, he visto ese enfoque:

# 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
Oleg Neumyvakin
fuente
1

Para un propósito de depuración:

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

Para un propósito clásico

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

Exigir

Debajo del soporte del servidor en el archivo de configuración

access_log /dev/stdout;
intika
fuente