首页 > 解决方案 > 如何从 dockerized php 应用程序记录到文件

问题描述

我有一个 php 应用程序 dockerized。我的问题是如何将 php 服务中的错误捕获到主机上的专用文件中。docker 文件看起来是下一个:

version: "3.9"

services:
  web:
    image: nginx:latest
    ports:
      - "3000:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./public:/public
  php:
    build:
      context: .
      dockerfile: PHP.Dockerfile
    environment:
      APP_MODE: 'development'
    env_file:
      - 'dev.env'
    volumes:
      - ./app:/app
      - ./public:/public
      - ./php.conf:/usr/local/etc/php-fpm.d/zz-log.conf
  mysql:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: <pass here>
    env_file:
      - 'dev.env'
    volumes:
      - mysqldata:/var/lib/mysql
      - ./app:/app
    ports:
        - '3306:3306'
volumes:
  mysqldata: {}

我在 php 服务内部php.conf的映射/usr/local/etc/php-fpm.d/zz-log.conf如下所示:

php_admin_value[error_log] = /app/php-error.log
php_admin_flag[log_errors] = on
catch_workers_output = yes

我的意图是使用 phperror_log()函数并记录所有日志,php-error.log其中的文件是 volume 中的一个文件app。现在,来自容器的所有日志仅显示在终端上。

我已经为此苦苦挣扎了几个小时,不知道如何继续。谢谢

标签: phpdockererror-logging

解决方案


我不知道你的源图像是什么。我假设一些 PHP 的官方 docker 镜像,例如https://hub.docker.com/_/php

所有容器化应用程序通常都配置为登录,stdout因此您必须覆盖该行为。这真的是 PHP 特定的,我不是 PHP 专家。从您告诉我们的情况来看,您似乎知道如何覆盖该行为(通过使用某些error_log()函数和php_admin_value[error_log] = /app/php-error.log属性。

如果行为被覆盖,您应该确保文件app/php-error.log存在于 PHP 容器内(即通过类似的方式进入容器内docker exec -it my-container-id /bin/bash,然后执行ls /app/php-error.logcat /app/php-error.log查看文件是否已创建。

因为您正在将./app目录从主机安装到/app容器中的目录,所以您已经将它们镜像了。无论容器内有什么,/app您都可以在您的/path/to/docker/compose/app目录中找到。您可以检查文件是否存在以及里面是否有一些内容。如果不是,您未能覆盖 PHP 登录到的默认行为。


推荐阅读