stdout / stderr에 Apache2 로그를 작성 하시겠습니까?


29

도커 컨테이너에서 Apache2를 실행 중이며 디스크에 아무것도 쓰지 않고 stdout 및 stderr에 로그를 작성하려고합니다. 이 작업을 수행하는 몇 가지 방법 ( Supervisord 및 stdout / stderr , Apache 액세스 로그 stdout )을 보았지만 해킹처럼 보입니다. 기본적으로이 작업을 수행 할 수있는 방법이 없습니까?

분명히, 나는 로그를 꼬리에 붙이고 싶지 않습니다. 왜냐하면 컨테이너의 디스크에 내용이 기록되기 때문입니다.


문제 해결 / 디버깅 목적으로 해당 로그에 쉽게 액세스하기를 원하지 않습니까? 왜 대신 (r) syslog 서버에 작성하지 않습니까?
HTTP500

@ HTTP500-도커 컨테이너 외부에서 캡처됩니다.
Matt

FROM php : 5.6-apache를 사용하는 경우 이미 stdout 및 stderr에 대한 로그가 포함되어 있습니다.
Martlark

답변:



25

apache2 패키지가 설치된 후 Dockerfile에 배치하는 것은 어떻습니까?

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

이것이 로그의 경로라고 가정합니다. Ubuntu 14.04 용이며 Ubuntu 16.04에서도 작동합니다.

참고 : 심볼릭 링크가 /dev/stdout있거나 확실하다면 해당 링크 /proc/stderr를 사용할 수도 있습니다. 이것이 실제 파일에 대한 경로를 선호합니다.


Ubuntu 16.04 와도 잘 작동합니다 :)
OkieOth

1
젠장, 그것은 독창적 인 해킹입니다! Apache는 일반 파일을 열려고 시도하지만 symlink를 통해 자체 관점에서 자체 표준 출력으로 리디렉션됩니다.
joonas.fi

1
감사합니다 ... 공식 아파치 httpd 2.4 도커 컨테이너는 SSL을 활성화 한 후 로그를 쓰지 못합니다. 이 라인 + ssl_request_log를 httpd2.4에서 가져온 Dockerfile에 추가하면 효과가 있습니다.
j.con

3
/ proc / self / fd / 1을 / dev / stdout으로 축약 할 수 있습니다. 그들은 정확히 같은 것입니다.
척 아담스

@ChuckAdams-소프트 링크이며 일반적으로 존재하지만 이미지를 만들 때 보장 할 수는 없습니다. 특히 마이크로 이미지를 줄입니다. 커널은 항상 / proc / self / fd / 1 & 2를 내 보냅니다.
Matt

1

구체적으로 대답을 요구하지는 않았지만 시나리오에 따라 더 나은 방법은 stdout / stderr에 전혀 기록하지 않는 것입니다. JSON 형식으로 로그를 cat에 파이프하면됩니다. 이것은 json이 스트림을 구별하기 위해 필요한 데이터를 가질 수 있기 때문에 스트림을 구별 할 필요가 없습니다. 예를 들어 다음과 같은 내용이 있습니다. 그런 다음 그레이 로그와 같은 것으로 훨씬 쉽게 섭취 할 수 있습니다.

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 \" }"

gelf 로깅 모듈도 있으므로 원하는 경우 아파치에서 그레이 로그 유형 서버로 직접 스트리밍 할 수 있습니다

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