2016-07-21 5 views
6

Symfony 응용 프로그램의 도커 이미지를 작성하고 있습니다. 이 이미지에서 Symfony 로그를 stdout으로 스트리밍하려고합니다. 그래서, 구성 방법의 nginx 로그와 유사, 내 Dockerfile이 라인을 추가 :symfony가 Docker 컨테이너의 stdout에 로그합니다.

ln -sf /dev/stdout /var/www/project/app/logs/prod.log 

컨테이너 내부를, 나는이를 볼 수 있습니다 그러나

$ ls /var/www/project/app/logs/ -l 
total 12 
-rw-r--r-- 1 501 games 4473 Jul 21 08:36 dev.log 
lrwxrwxrwx 1 501 games 11 Jul 21 08:35 prod.log -> /dev/stdout 

을, 응용 프로그램은 다음과 같은 오류가 발생합니다 :

PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'The stream or file "/var/www/project/app/logs/prod.log" could not be opened: failed to open stream: No such file or directory' in /var/www/project/app/cache/prod/classes.php:5808
Stack trace:
#0 /var/www/project/app/cache/prod/classes.php(5746): Monolog\Handler\StreamHandler->write(Array)
#1 /var/www/project/app/cache/prod/classes.php(5917): Monolog\Handler\AbstractProcessingHandler->handle(Array)
#2 /var/www/project/app/cache/prod/classes.php(6207): Monolog\Handler\FingersCrossedHandler->handle(Array)
#3 /var/www/project/app/cache/prod/classes.php(6276): Monolog\Logger->addRecord(500, 'Fatal Error: Un...', Array)
#4 /var/www/project/app/cache/prod/classes.php(1978): Monolog\Logger->log('critical', 'Fatal Error: Un...', Array)
#5 /var/www/project/app/cache/prod/classes.php(2034): Symfony\Component\Debug\ErrorHandler->handleException(Object(Symfony\Component\Debug\Exception\FatalErrorException), Array)
#6 [internal function]: Symfony\Component\Debug\E in /var/www/project/app/cache/prod/classes.php on line 5808

의견이 있으십니까?

+2

메시지가 추측의 여지가 없습니다 : "/var/www/project/app/logs/prod.log"스트림 또는 파일을 열 수 없습니다 : 스트림을 열지 못했습니다 : 해당 파일 또는 디렉토리가 없습니다 –

+0

분명히 .. 그것은/dev/stdout을 가리키는 심볼릭 링크이기 때문에 쓰기를 위해 파일을 열 수있는 것 같지 않습니다. 그러나 나는 이것을 어떻게 얻을 수 있습니까? (일명 Symfony 로그를이 파일 대신 stdout으로 만드십시오) – Webberig

+0

파일은 어떻게 열리나요? 즉. "w"플래그 만 사용 하시겠습니까? –

답변

16

Monolog를 사용하면 stdout/stderr에 로그하는 것이 매우 쉽습니다. 내 예제 stderr 사용하고 있지만 그것은 stdout 함께 동일하다고 생각합니다.

대신 그냥 따라 스트림 경로

path: "php://stderr" 

를 입력 로그 파일을 정의하지만 아직 완료되지 않습니다. 그에 따라 PHP를 구성해야합니다. 작업자는 프로세스의 출력을 파악하고이 출력을 다시 표준 오류에 기록해야합니다.

PHP 구성

#/etc/php/7.0/fpm/php-fpm.conf 
error_log = /proc/self/fd/2 

#/etc/php/7.0/fpm/pool.d/www.conf 
catch_workers_output = yes 

심포니 구성

# app/config/config_prod.yml 
monolog: 
    handlers: 
     main: 
      type:   fingers_crossed 
      action_level: error 
      handler:  nested 
     nested: 
      type: stream 
      path: "php://stderr" 
      level: debug 
     console: 
      type: console 

당신이 시스템 로그는 표준 출력 할 수 있는지 가야 지방 고정 표시기 컨테이너의 모든 공정 제어 시스템을 사용하는 경우. 상사와

예 : 모두

[supervisord] 
nodaemon=true 
;@see http://blog.turret.io/basic-supervisor-logging-with-docker/ 
;we need the output from the controlled processes 
;but this is only possible with lowered loglevel 
loglevel=debug 

모든

가서 확인하십시오 :

  • 표준 출력으로 응용 프로그램 로그/표준 에러
  • PHP는
  • 옵션을 stderr에 작업자 출력 로그를 잡는다 : 모든 프로세스 제어 시스템은 관리되는 프로세스의 출력을 표준 출력으로 전달해야합니다.
+0

경로 매개 변수를 변경하면 고맙습니다! – Webberig

+1

symfony가'var/logs/* .log'와'stderr' 둘 다에 로그하기를 원한다면? 멀티 캐스트 지원이없는 것처럼 보이기 때문에 중복 처리기가 필요합니다. –

+1

표준 Docker 이미지를 사용하는 경우 php-fpm 설정을 변경할 필요가 없습니다. 여기에는 명시된 구성 설정이 포함되어 있습니다. –

관련 문제