gpt4 book ai didi

php - 在 php/symfony2 中有条件地创建和保存单独的日志文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:52 26 4
gpt4 key购买 nike

在我工作的一个项目中,我们使用 Symfony2 控制台命令来运行图像转换(使用 LaTeX 和一些 imagick)。由于项目的性质,在控制台命令运行期间可能不会满足所有条件,因此执行将失败,稍后使用 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 接口(interface),没有任何添加处理程序的方法。我必须使用的解决方案实际上检查使用的记录器是否是 Monolog\Logger 的实例,然后在 Symfony2 控制台命令的 initialize() 方法中手动向其添加 BufferHandler。然后,当我检查尝试限制时,如果尚未达到限制,我会关闭缓冲区处理程序并删除实际的日志文件(因为 BufferHandler 无法在不刷新所有内容的情况下删除/关闭自身)。如果是,我就让日志文件保留下来。这种方式有效,但它总是写入日志,如果不满足条件(达到尝试限制),我必须删除日志。

最佳答案

我认为您必须创建一个自定义处理程序。

使用 Monolog,您可以登录数据库(参见示例 https://github.com/Seldaek/monolog/blob/master/doc/04-extending.md)

因此,很容易知道自 x 天以来发生了多少次错误。(类似于:“从 monolog 中选择 count(*),其中 channel='...' and time>...”)

关于php - 在 php/symfony2 中有条件地创建和保存单独的日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31345223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com