在我正在工作的项目上,我们使用Symfony2控制台命令来运行图像转换(使用LaTeX和一些想象力)。由于项目的性质,在控制台命令运行期间并非所有条件都满足,因此执行将失败,稍后将使用cron作业重新启动,仅如果尝试计数不高于预定义限制
我们已经在我们的项目中登录,我们使用Monolog记录器。我基本上想要的是以某种方式复制转发到另一个日志文件中的主日志文件的所有内容,专门为该控制台命令执行而创建,而仅在达到尝试限制时。
所以,如果我们运行一次命令并且它失败了 - 它没问题,什么都不应该创建。 但是如果我们第10次运行命令,这是尝试限制,我想要一个名为的单独的日志文件,比如' /logs/failed_commands//fail.log'。该日志文件应仅包含上次失败尝试的消息,但不包含所有先前尝试的消息。
怎么做?我是否需要特殊记录器处理程序(如FingersCrossed)和正确的异常处理的某种组合?我是否应该创建额外的记录器实例(如果是这样,我如何将其传递给依赖服务?)
这是运行图像转换的简化和清理的命令。使用$this->checkProcessLimit()
方法
public function execute(InputInterface $input, OutputInterface $output)
{
try {
set_time_limit(0); //loose any time restrictions
$this->checkingDirectories();
$this->checkProcessLimit();
$this->isBuildRunning();
$this->checkingFiles();
try {
$this->startPdfBuilding();
} catch (InternalProjectException $e) {
throw PdfBuildingException::failedStartBuilding($this->pressSheet->getId());
}
} catch (PdfBuildingException $e) {
$this->printError($output, $e);
return;
}
try {
$this->logger->info('Building Image.');
$this->instantiatePdfBuilder();
$buildingResult = $this->pdfBuilder->outputPdf();
$this->generatePreview($buildingResult);
$this->movePDFs($buildingResult);
$this->unlinkLockFile();
$output->writeln('<info>Image successfully built</info>');
} catch (LaTeXException $e) {
$this->unlinkLockFile();
$this->abortPdfBuilding($e->getMessage());
$this->printError($output, $e);
return;
}
}
UPD:似乎要转储一堆日志条目,我需要使用与Monolog Logger捆绑在一起的BufferHandler。但是,只有当错误限制(而不是错误级别)达到时,我仍然需要弄清楚如何设置它以获得转储。
UPD2 :我设法让它发挥作用,但我不喜欢这个解决方案。
因为在Symfony2中你必须在config.yml中定义记录器并且必须为配置中的任何更改重建缓存,我不得不求助于向记录器动态添加处理程序。但是记录器本身被认为是Psr\Log\LoggerInterface
接口,它没有任何添加处理程序的方法。我必须使用的解决方案实际检查使用的logger是Monolog\Logger
的实例,然后在Symfony2控制台命令的initialize()
方法中手动添加BufferHandler。
然后,当我检查尝试限制时,我关闭缓冲区处理程序并删除实际日志文件(因为如果还没有限制,BufferHandler无法移除/关闭自己而不会刷新所有内容)到达。如果是,我只是让日志文件保留。
这种方式可行,但始终写入日志,如果不满足条件(达到尝试限制),我必须删除日志。
答案 0 :(得分:0)
我认为你必须创建一个自定义处理程序。
使用Monolog,您可以登录数据库(例如参见https://github.com/Seldaek/monolog/blob/master/doc/04-extending.md)
因此,很容易知道自x天以来错误被提升了多少次。 (例如:&#34;从monolog中选择count(*),其中channel =&#39; ...&#39; and time&gt; ...&#34;)