¿Escribir registros de Apache2 en stdout / stderr?

29

Estoy ejecutando Apache2 en un contenedor acoplable y no quiero escribir nada en el disco, escribiendo registros en stdout y stderr. He visto algunas formas diferentes de hacer esto ( Supervisor y stdout / stderr , registro de acceso de Apache a stdout ) pero estos parecen trucos. ¿No hay forma de hacer esto por defecto?

Para que quede claro, no quiero ajustar el registro, ya que eso provocará que las cosas se escriban en el disco en el contenedor.

aronchick
fuente
¿No vas a querer que esos registros sean fácilmente accesibles para propósitos de resolución de problemas / depuración? ¿Por qué no simplemente escribirlos en un (s) servidor syslog?
HTTP500
@ HTTP500: se capturan en el exterior del contenedor acoplable.
Matt
Si usa: FROM php: 5.6-apache, eso ya incluye registros para stdout y stderr.
Martlark

Respuestas:

30
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

funciona en ubuntu y centos para mí

Oskarowski
fuente
en qué archivo debe ir, etc. por favor
Alexander Mills
Esto va en su domain.confarchivo o .htaccesssi no está utilizando a conf.
Tyler Christian
25

¿Qué tal si coloca esto en su Dockerfile después de instalar el paquete apache2?

RUN ln -sf /proc/self/fd/1 /var/log/apache2/access.log && \
    ln -sf /proc/self/fd/1 /var/log/apache2/error.log

Asumiendo que este es el camino de los registros. Es para Ubuntu 14.04 y también funciona para Ubuntu 16.04.

Nota: si está seguro de que los enlaces simbólicos /dev/stdouto /proc/stderrestán allí, también puede usarlos. Prefiero la ruta al archivo real ya que esto está garantizado presente.

Mate
fuente
funciona muy bien también con Ubuntu 16.04 :)
OkieOth
1
¡Maldición, es un truco ingenioso! Apache intenta abrir un archivo normal, pero se redirige a través de un enlace simbólico a su propio stdout desde su propia perspectiva.
joonas.fi
1
Solo quiero decir gracias ... el contenedor docker oficial apache httpd 2.4 no puede escribir registros después de habilitar ssl. Agregar estas líneas + ssl_request_log al Dockerfile que extrae de httpd2.4 funcionó.
j.con
3
Puede abreviar / proc / self / fd / 1 como / dev / stdout. Son exactamente lo mismo.
Chuck Adams el
@ChuckAdams: son un enlace suave y normalmente están ahí, pero no garantizan al crear imágenes que estén presentes. Especialmente cortar micro imágenes. Mientras que el núcleo siempre exportará / proc / self / fd / 1 & 2.
Matt
1

No es específicamente una respuesta solicitada, pero tal vez una mejor manera, dependiendo de su escenario, sería no iniciar sesión en stdout / stderr. Simplemente canalice los registros a cat en formato JSON. Esto eliminaría la necesidad de diferenciar las secuencias, ya que el json podría tener los datos necesarios para distinguirlas. por ejemplo, algo como lo siguiente. Esto puede ser ingerido mucho más fácilmente en algo como graylog

GlobalLog "| cat - " gelf
ErrorLog "| cat - " 

LogFormat "{ \"apache_log\": \"ACCESS\", \"app_name\": \"apache\",  \"Connection\": \"%{X-Forwarded-Proto}i:%{X-Forwarded-Port}i \", \"X-Forwarded-For\": \"%{X-Forwarded-For}i\",  \"version\": \"1.1\", \"vhost\": \"%V\", \"short_message\": \"%r\", \"timestamp\": %{%s}t, \"level\": 6, \"user_agent\": \"%{User-Agent}i\", \"source_ip\": \"%a\", \"duration_usec\": %D, \"duration_sec\": %T, \"request_size_byte\": %O, \"http_status\": %s, \"http_request_path\": \"%U\", \"http_request\": \"%U%q\", \"http_method\": \"%m\", \"http_referer\": \"%{Referer}i\", \"X-Powered-By\": \"%{X-Powered-By}i\" }" gelf

ErrorLogFormat "{ \"app_name\": \"apache\",  \"apache_log\": \"ERROR\", \"time\":\"%{%Y-%m-%d}tT%{%T}t.%{msec_frac}tZ\", \"function\" : \"[%-m:%l]\" , \"process\" : \" [pid %P:tid %T] \" , \"message\" : \"%M\" ,\ \"referer\"\ : \" %{Referer}i \" }"

También hay un módulo de registro gelf, por lo que también puede transmitir directamente desde apache a un servidor de tipo graylog si lo desea

krad
fuente