我想知道如何将Yii2控制台命令的输出保存到文件中?或者我如何记录输出,以便稍后可以读取,例如,如果命令以cronjob的形式运行?
感谢。
解
正如Beowulfenator所指出的,我使用了Yii的Logger
功能。
因此,在我的配置文件中,我为FileTarget
级别定义了一个新的trace
。
// config/console.php
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
'class' => 'yii\log\FileTarget',
'levels' => ['trace'],
'logVars' => [],
'logFile' => '@runtime/logs/commands.log'
]
],
],
在我的控制台控制器中,我重写了stdout
方法,如下所示:
/* A public variable to catch all the output */
public $output;
/* Example of action outputting something to the console */
public function actionWhatever()
{
$this->stdout("whatever");
}
/* Overriding stdout, first calling the parent impl which will output to the screen, and then storing the string */
public function stdout($string)
{
parent::stdout($string);
$this->output = $this->output.$string."\n";
}
/* In the afterAction hook, I log the output */
public function afterAction($action, $result)
{
$result = parent::afterAction($action, $result);
Yii::trace($this->output, 'categoryName');
return $result;
}
答案 0 :(得分:4)
最好的方法是使用stream redirection。你基本上写这样的东西来创建一个新的日志文件或每次你的脚本运行时覆盖现有的日志文件:
yii example-controller/example-action > example.log
...或类似的东西附加到现有的日志文件,累积数据:
yii example-controller/example-action >> example.log
这种方法并非特定于yii,您可以将任何地方的输出重定向到任何地方。
您可能无法将所有命令的输出记录到文件中。然后你应该考虑使用Yii2的logging feature和文件目标。您定义将保留您的日志的文件。然后,如果需要将某些内容放入日志中,则使用Yii::trace()
或其他适当的命令执行此操作,如果只需要在屏幕上显示该消息,则为echo
。