草庐IT

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

coder 2024-04-08 原文

在我工作的一个项目中,我们使用 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/

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

  1. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  2. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  3. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  4. ruby - ruby 中有 each_if 吗? - 2

    假设我在Ruby中有这个each循环。@list.each{|i|putsiifi>10breakend}我想循环遍历列表直到满足条件。这让我感到“不像Ruby”,因为我是Ruby的新手,是否有Ruby方法可以做到这一点? 最佳答案 您可以使用Enumerable#detect或Enumerable#take_while,取决于您想要的结果。@list.detect{|i|putsii>10}#Returnsthefirstelementgreaterthan10,ornil.正如其他人所指出的,更好的风格是先进行子选择,然后再对其

  5. ruby-on-rails - 使用包含多个关联和单独的条件 - 2

    我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS

  6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  7. ruby-on-rails - "assigns"在 Ruby on Rails 中有什么作用? - 2

    我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o

  8. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

    我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

  9. ruby - 确定字符串的结尾是否与单独的字符串的开头重叠 - 2

    我想查找字符串的结尾是否与单独字符串的开头重叠。例如,如果我有这两个字符串:string_1='Peoplesaynothingisimpossible,butI'string_2='butIdonothingeveryday.'如何找到string_1末尾的“butI”部分与string_2开头相同?我可以编写一个方法来遍历这两个字符串,但我希望得到一个包含我错过的Ruby字符串方法或Ruby习惯用法的答案。 最佳答案 将MARKER设置为一些从未出现在您的string_1和string_2中的字符串。有一些方法可以动态地做到这一

  10. ruby-on-rails - 将保存回调添加到单个 ActiveRecord 实例,可以吗? - 2

    是否可以为单个ActiveRecord实例添加回调?作为进一步的限制,这是继续使用库,所以我无法控制该类(除了对其进行猴子修补)。这或多或少是我想做的:defdo_something_creazymessage=Message.newmessage.on_save_call:do_even_more_crazy_stuffenddefdo_even_more_crazy_stuff(message)puts"Message#{message}hasbeensaved!Hallelujah!"end 最佳答案 你可以通过在创建对象后立

随机推荐