Docker의 Apache : "access.log"는 어떻게합니까?


17

방금 Docker를 시작하고 richt를 시작하여 첫 번째 dockerized Apache 2 / PHP 환경을 설정하는 방법을 알아 내려고합니다. 지금까지는 / var / log / apache2에 기록되는 로그 파일을 사용한 전체 Linux VM을 사용하고 있으며 "logrotate"를 사용하여 매일 새 파일로 홉핑합니다.

로그 파일은 주로 즉각적인 오류 감지 (예 : 서버에 로그온하고 현재 access.log 및 error.log 파일을 여는 데 덜 사용)와 fail2ban에 사용되었습니다.

내가 정확하다면 Docker 환경에서는 불가능합니다. 주로 일반적으로 컨테이너에 로그인하여 로그를 볼 수 없기 때문입니다. 컨테이너를 제거하면 로그도 손실됩니다.

따라서 해당 상황에서 access.log / error.log를 사용 / 에뮬레이션 / 대체하는 가장 일반적인 방법은 무엇입니까? 프로덕션 및 개발 환경 모두에 공통적 인 솔루션은 무엇입니까?

내 생각에는 NFS 공유 (느리고 조심하지 않으면 파일 이름 충돌이 발생할 수 있음) 및 logstash (소규모 사이트 또는 개발 환경에서 노력할 가치가 있는지 확실하지 않은가)가 포함되어 있지만 똑똑한 사람들이라고 확신합니다. 더 나은 솔루션을 생각해 냈습니까?

차이가 있는지 확실하지 않지만 현재 Docker 이미지를 php : 5.6-apache 기반으로하고 있습니다.

답변:


13

여전히 docker exec -it <your container name> /bin/bash명령을 사용 하여 컨테이너에 들어가 정규 작업을 수행 할 수 있습니다. 또는 /bin/bash명령 또는 명령 스크립트로 변경 .sh하여 실행할 수도 있습니다.

컨테이너에서 파일을 꺼내려면 docker cp <container name:/path/to/file> </your local machine/path/>

그리고 일상적인 작업 cron을 위해 이러한 명령을 cronjob하는 데 사용할 수 있습니다 . 자주 사용하는 docker 명령의 별칭을 지정하는 것이 좋습니다. 몇 키로 도커를 행복하게 사용할 수 있습니다.

docker logs <container name/id>명령은 docker 이미지 실행에서 로그를 보는 데 사용됩니다. 리디렉션 출력을 stdout으로 표시합니다.


또한 docker attach <container name>컨테이너에서 stdout을 보는 좋은 방법입니다. 그러나 Ctrl + D 또는 Ctrl + C를 수행하면 진행중인 작업이 종료됩니다 (시그 킬). 따라서 이스케이프 키를 사용하여 올바르게 분리해야합니다 ctrl+p+q. 컨테이너에 껍질을 넣고 싶다면 exec위의 명령을 사용하는 것이 좋습니다.
Fony Lew

6

stderr 및 stdout에 액세스 및 오류 로그를 작성하는 것은 어떻습니까?

https://mail-archives.apache.org/mod_mbox/httpd-users/201508.mbox/%3CCABx2=D-wdd8FYLkHMqiNOKmOaNYb-tAOB-AsSEf2p=ctd6sMdg@mail.gmail.com%3E

https://gist.github.com/afolarin/a2ac14231d9079920864

실행 ln -sf / dev / stdout /var/log/nginx/access.log

실행 ln -sf / dev / stderr /var/log/nginx/error.log

ELK를 사용한 중앙 로깅 은보다 능동적 인 모니터링을 가능하게합니다. 그러나 당신은 이미 그 것을 스스로 생각했습니다.


1

지금까지 나는 " docker logs "가 여러 번 언급되고 있음을 발견 했습니다.

나는 절대 Docker newb이므로 내 문제에 대한 해결책을 가질 수 있지만 지금까지 그 명령의 개념을 완전히 이해하지 못했습니다.

Docker는 모든 stdout 출력을 JSON 파일 의 / var / lib / docker / containers /에 유지하고 logs 명령을 통해 액세스 할 수있는 기회를 제공합니다.

지금까지 실제로 출력을 사용하는 방법을 모르겠습니다.


1

질문이있을 때이 기능이 없었을 수도 있지만 run의 -v 인수를 사용하면 호스트의 디렉토리를 컨테이너의 디렉토리에 마운트 할 수 있습니다.

docker run -v [host_dir]:[container_dir]

이렇게하면 컨테이너가 삭제 될 때 로그 (또는 다른) 파일이 유지되며 마치 컨테이너가 아닌 호스트에 아파치가 설치된 것처럼 파일에 액세스 할 수 있습니다.

또는 수정 된 로그 파일을 중앙 위치로 푸시 할 수 있습니다. Kibana 스택은 파일 비트를 사용하여이를 달성하지만 나머지 스택에 신경 쓰지 않으면 독립적으로 파일 비트를 실행할 수 있습니다.


1
Docker는 3 년 전에 바인드 마운트 볼륨을 가졌습니다.
울다

0
root@my_docker:~ # ls -l /var/log/apache2/
total 0
lrwxrwxrwx 1 root root 11 Jul 17 04:55 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jul 17 04:55 error.log -> /dev/stderr
lrwxrwxrwx 1 root root 11 Jul 17 04:55 other_vhosts_access.log -> /dev/stdout
root@my_docker:~ #

내가 선택한 도커 이미지는 모든 * .log 파일을 / dev / stdout 및 / dev / stderr에 연결했기 때문에 읽을 수 없었습니다.

파일을 제거하고 아파치를 다시 시작한 후 도커의 / var / log /에서 로그를 얻을 수 있습니다.

docker-compose exec apache bash -c "tail -f /var/log/apache2/*.log"

0

아파치 구성 파일에서 다음을 추가 할 수 있습니다.
CustomLog / dev / stdout
ErrorLog / dev / stderr

로그를 보려면 아래 명령을 사용하십시오.
docker logs container_id

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