webentwicklung-frage-antwort-db.com.de

Symfony-Protokolle werden im Docker-Container gespeichert

Ich erstelle ein Docker-Image für eine Symfony-Anwendung. In diesem Bild möchte ich die Symfony-Protokolle auf stdout streamen. Also, ähnlich wie Nginx-Protokolle konfiguriert sind, habe ich diese Zeile zu meiner Docker-Datei hinzugefügt:

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

Im Inneren des Containers sehe ich Folgendes:

$ 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

Die App gibt jedoch folgenden Fehler aus:

Schwerwiegender PHP-Fehler: Ungefangene Ausnahme 'UnexpectedValueException' mit der Meldung 'Der Stream oder die Datei "/var/www/project/app/logs/prod.log" konnte nicht geöffnet werden: Fehler beim Öffnen des Streams: Keine solche Datei oder solches Verzeichnis 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 (Objekt (Symfony\Component\Debug\Exception\FatalErrorException) Array)
# 6 [interne Funktion]: Symfony\Component\Debug\E in /var/www/project/app/cache/prod/classes.php in Zeile 5808

Irgendwelche Vorschläge ?

21
Webberig

Mit Hilfe von Monolog ist es sehr einfach, Protokolle an stdout/stderr zu senden. In meinen Beispielen wird stderr verwendet, aber ich denke, dasselbe gilt für stdout.

Anstatt eine Protokolldatei zu definieren, geben Sie einfach den bevorzugten Stream-Pfad ein

path:  "php://stderr"

ABER du bist noch nicht fertig. Sie müssen auch PHP) entsprechend konfigurieren. Die Worker müssen die Ausgabe ihrer Prozesse abfangen und diese Ausgabe erneut in ihrem stderr protokollieren.

PHP-Konfiguration

#/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-Konfiguration

# 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

Wenn Sie ein Prozessleitsystem in einem Fat Docker-Container verwenden, müssen Sie sicherstellen, dass sich dieses System auch bei stdout (oder stderr) anmeldet.

Beispiel mit Betreuer:

[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

Alles in allem stellen Sie sicher, dass:

  • Die Anwendung meldet sich bei stdout/stderr an
  • PHP fängt die Worker-Ausgabe ab und protokolliert in stderr
  • optional: Jedes Prozessleitsystem muss die Ausgabe von verwalteten Prozessen an stdout/stderr weiterleiten
35
frastel