将Symfony命令的输出保存到文件中

7

我正在使用Symfony2.0

我在Symfony中创建了一个命令,希望将其输出写入文件。

我想要的是将所有标准输出(控制台上的输出)都保存到一个变量中。这包括命令中的输出、其他文件中捕获的异常以及由命令调用的内容等。我希望将输出同时显示在屏幕上,并保存到一个变量中(以便将变量的内容写入文件)。我将在命令的execute()方法的末尾进行文件写入。

类似于以下代码:

protected function execute(InputInterface $input, OutputInterface $output)
{
    // some logic and calls to services and functions
    echo 'The operation was successful.';

    $this->writeLogToFile($file, $output???);
}

我希望文件中包含以下内容:

[Output from the calls to other services, if any]
The operation was successful.

您能帮我吗?

我尝试了类似于这样的东西:

   $stream  = $output->getStream();
   $content = stream_get_contents($stream, 5);

但是该命令并不以这种方式完成。:(

你可以编写自己的基础 Application 类,并实现实现 OutputInterface 的 writer,你可以在这里看到一些内容 [http://symfony.com/doc/2.0/cookbook/console/logging.html#enabling-automatic-exceptions-logging]。 - Matteo
3个回答

14

您可以使用标准shell方法通过 php app/console your:command > output.log 将命令输出转发。或者,如果这不是一个选择,您可以引入一个包装器来处理 OutputInterface,该包装器将写入流并将调用转发给被包装的输出。


3
很不幸,由于Symfony似乎以不同的方式输出内容,管道无法正常工作... - pyrsmk
显然,Symfony在某些情况下使用stderr进行输出。这个答案对我很有用。 - Lorenz Leitner
对我来说很好,谢谢。 - Eve

1
抱歉再次提出这个问题。 我处于类似的情况下,如果您浏览Symfony版本的代码(从2.7开始),已经有一个solution了。
您可以轻松地将其调整为适合您特定问题的解决方案:
    // use Symfony\Component\Console\Output\BufferedOutput;
    // You can use NullOutput() if you don't need the output
    $output = new BufferedOutput();
    $application->run($input, $output);

    // return the output, don't use if you used NullOutput()
    $content = $output->fetch();

这应该能很好地解决问题。

1

我也需要同样的东西。在我的情况下,我想将控制台输出的调试和审计信息发送到电子邮件中,因此我创建了一个匿名的PHP类包装器,它存储行数据,然后传递给原始输出实例,这仅适用于PHP 7+。

protected function execute(InputInterface $input, OutputInterface $output) {
    $loggableOutput = new class {
        private $linesData;
        public $output;

        public function write($data) {
            $this->linesData .= $data;
            $this->output->write($data);
        }

        public function writeln($data) {
            $this->linesData .= $data . "\n";
            $this->output->writeln($data);
        }

        public function getLinesData() {
            return $this->linesData;
        }
    };

    $loggableOutput->output = $output;

    //do some work with output

    var_dump($loggableOutput->getLinesData());
}

请注意,这只会存储使用writewriteln输出接口方法编写的数据,这不会存储任何PHP警告等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接