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

Edu*_*rev 5 php logging symfony monolog

在我正在工作的项目中,我们使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

UPD:似乎对于转储一堆日志条目,我需要使用与Monolog Logger捆绑在一起的BufferHandler.但是,我仍然需要找出设置它的方法,以便在达到错误限制(而不是错误级别)时获得转储.

UPD2:我设法让它工作,但我不喜欢这个解决方案.因为在Symfony2中你必须在config.yml中定义记录器并且必须为配置中的任何更改重建缓存,我不得不求助于向记录器动态添加处理程序.但是记录器本身被认为是Psr\Log\LoggerInterface接口,它没有任何添加处理程序的方法.我必须使用的解决方案实际检查使用的logger是否为实例,Monolog\Logger然后在Symfony2 Console命令的initialize()方法中手动添加BufferHandler .然后,当我检查尝试限制时,我关闭缓冲区处理程序并删除实际日志文件(因为如果尚未达到限制,则BufferHandler无法移除/关闭自身而不会刷新所有内容).如果是,我只是让日志文件保留.这种方式可行,但它总是写日志,如果不满足条件(达到尝试限制),我必须删除日志.

gri*_*eau 0

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

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

因此,很容易知道自 x 天以来错误发生了多少次。(类似于:“从独白中选择计数(*),其中通道='...'和时间>...”)