2016-07-21 25 views
6

Buduję obraz dokowany dla aplikacji Symfony. Na tym obrazie chcę przesyłać strumieniowo logi Symfony na standardowe wyjście. Tak więc, podobnie jak nginx dzienników skonfigurowane są dodałem tę linię do mojego Dockerfile:Logi z Symfony do stdout wewnątrz kontenera Docker

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

wewnątrz pojemnika, widzę to:

$ 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 

jednak, aplikacja generuje następujący błąd:

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

Wszelkie sugestie?

+2

Wiadomość nie pozwala na spekulacje: Nie można otworzyć strumienia lub pliku "/var/www/project/app/logs/prod.log": nie można otworzyć strumienia: Brak takiego pliku lub katalogu –

+0

Oczywiście .. Wydaje się, że nie jest w stanie otworzyć pliku do zapisu, ponieważ jest to dowiązanie symboliczne wskazujące na/dev/stdout. Ale jak mogłem to osiągnąć? (aka zrobić, aby log Symfony stał się stdout zamiast tego pliku) – Webberig

+0

jak jest otwierany plik? to znaczy. tylko przy użyciu flagi "w"? –

Odpowiedz

16

Za pomocą Monolog bardzo łatwo zalogować się na standardowe wyjście/stderr. Moje przykłady używają stderr, ale myślę, że to samo z stdout.

Zamiast definiować plik dziennika po prostu wprowadzić zgodnie ścieżka strumień

path: "php://stderr" 

ale nie są jeszcze gotowe. Musisz również odpowiednio skonfigurować PHP. Pracownicy muszą przechwytywać wydajność swoich procesów i ponownie zapisywać dane wyjściowe do swoich stderr.

Konfiguracja 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 

Symfony Konfiguracja

# 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 

Jeśli używasz dowolnego systemu sterowania procesem w pojemniku tłuszcz Döcker trzeba iść, czy to logi systemowe również na standardowe wyjście.

Przykład z przełożonym:

[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 

W sumie iść się, że:

  • logi aplikacji do stdout/stderr
  • PHP łapie wyjście pracownika i dzienniki na stderr
  • opcjonalne : każdy system sterowania procesem musi przekazywać dane wyjściowe zarządzanych procesów do stdout
+0

zmiana parametru ścieżki wydaje się działać, dziękuję! – Webberig

+1

Co jeśli chcesz, aby Symfony logował się zarówno do 'var/logs/*. Log' i' stderr'? Prawdopodobnie potrzebne są zduplikowane procedury obsługi, ponieważ nie ma tam żadnej obsługi multiemisji. –

+1

Nie musisz zmieniać żadnych ustawień php-fpm, jeśli używasz standardowego obrazu Docker, zawiera on określone ustawienia konfiguracji dla ciebie. –