Получение всех путей к файлам монологов во время развертывания в symfony 4 - PullRequest
0 голосов
/ 17 апреля 2020

Я использую монолог в symfony 4.4 с apache http сервером. Ведение журнала работает нормально. Но у меня есть проблема.

В среде prod создаются следующие файлы журнала:

  • Файл prod.log с правами файла 770 , разрешение пользователя "user1" и разрешение группы "www-data"
  • Файл prod_deprecations.log с правами файла 644 , разрешение пользователя "www-data" и разрешение группы "www-data"
  • Файл prod_errors.log с правами файла 666 , разрешения пользователя "www-data" и разрешения группы "www-data"

Как видите, права доступа к файлам, права пользователей и группы для файлов журналов разные.

И я хочу добиться того, чтобы все три файла журнала имели одинаковые права доступа, такие как prod.log.

Я использую самописный сценарий развертывания в команде symfony. Во время развертывания также создается файл prod.log. Но не другие два файла.

Теперь моя идея состоит в том, чтобы я генерировал все файлы журналов во время развертывания. Поэтому мне нужны все пути к файлам монологов во время развертывания.

Существует ли механизм symfony для получения ВСЕХ путей файла журнала монолога (например, для prod-environment)? Как я могу достичь этого? Заранее спасибо за помощь.

Вот выдержка из файла конфигурации monolog (monolog.yaml):

monolog:
    handlers:
        nested:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
        deprecation:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%_deprecations.log"

        error:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%_errors.log"
            level: error
            max_files: 10
            action_level: error

1 Ответ

0 голосов
/ 20 апреля 2020

Вот так я решил это сам.

namespace App\Service;

// ...

use Symfony\Component\Yaml\Yaml;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;

class LogFilesGenerator
{
    private $params;

    public function __construct(ContainerBagInterface $params)
    {
        $this->params = $params;
    }

    public function createEmptyLogFiles($output)
    {
        $appEnv = $this->params->get('kernel.environment');
        $kernelLogsDir = $this->params->get('kernel.logs_dir');
        $kernelProjectDir = $this->params->get('kernel.project_dir');

        $filePath = realpath($kernelProjectDir.'/config/packages/'.$appEnv.'/monolog.yaml');

        $monologFileContent = Yaml::parseFile($filePath);
        $monologFileHandlers = $monologFileContent['monolog']['handlers'];


        array_walk_recursive($monologFileHandlers, function($value, $key) use ($appEnv, $kernelLogsDir) {
            if($key === 'path') {
                $path = $value;
                $path = str_replace('%kernel.environment%', $appEnv, $path);
                $path = str_replace('%kernel.logs_dir%', $kernelLogsDir, $path);
                // next step create empty files with $path 
                ...
            }
        });
    }
}
...