如何启用登录控制台命令
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
如何启用登录控制台命令
Console组件不提供任何开箱即用的日志功能。通常,您手动运行控制台命令并观察输出,这就是不提供日志记录的原因。但是,在某些情况下可能需要日志记录。例如,如果您在无人参与的情况下运行控制台命令,例如从cron作业或部署脚本运行控制台命令,那么使用Symfony的日志功能可能会更容易,而不是配置其他工具来收集控制台输出并对其进行处理。欧宝娱乐app下载地址如果您已经有了一些用于聚合和分析Symfony日志的现有设置,那么这可能会特别困难。欧宝娱乐app下载地址
基本上你需要两种日志记录情况:
- 手动记录命令中的一些信息;
- 记录未捕获的异常。
从控制台命令手动登录
这个很简单。在全堆栈框架中创建控制台命令时,如“控制台命令,你的命令延伸了ContainerAwareCommand.这意味着你可以通过容器访问标准记录器服务,并使用它来进行日志记录:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/ / src / AppBundle /命令/ GreetCommand.php名称空间AppBundle\命令;使用欧宝娱乐app下载地址\包\FrameworkBundle\命令\ContainerAwareCommand;使用欧宝娱乐app下载地址\组件\控制台\输入\InputArgument;使用欧宝娱乐app下载地址\组件\控制台\输入\InputInterface;使用欧宝娱乐app下载地址\组件\控制台\输入\InputOption;使用欧宝娱乐app下载地址\组件\控制台\输出\OutputInterface;使用Psr\日志\LoggerInterface;类GreetCommand扩展ContainerAwareCommand{/ /……受保护的函数执行(InputInterface$输入, OutputInterface$输出){/**@var$logger LoggerInterface */$日志记录器=$这->getContainer ()->get (“日志”);$的名字=$输入->getArgument (“名字”);如果($的名字) {$文本=“你好”.$的名字;}其他的{$文本=“你好”;}如果($输入->getOption (“喊”)) {$文本= strtoupper ($文本);$日志记录器->警告(“喊道:”.$文本);}其他的{$日志记录器->信息(”迎接:“.$文本);}$输出->writeln ($文本);}}
根据运行命令的环境(以及日志记录设置),应该可以看到已登录的条目应用程序/日志/ dev.log
或应用程序/日志/ prod.log
.
启用自动异常日志记录
要让控制台应用程序自动记录所有命令的未捕获异常,可以使用控制台的事件.
2.3
控制台事件在Symfony 2.3中引入。欧宝娱乐app下载地址
首先在服务容器中为控制台异常事件配置监听器:
- YAML
- XML
- PHP
1 2 3 4 5 6 7
# app / config / services.yml服务:app.listener.command_exception:类:AppBundle \ EventListener \ ConsoleExceptionListener参数:(“@logger”)标签:-{名称:kernel.event_listener,事件:console.exception}
然后实现实际的监听器:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/ / src / AppBundle / EventListener / ConsoleExceptionListener.php名称空间AppBundle\EventListener;使用欧宝娱乐app下载地址\组件\控制台\事件\ConsoleExceptionEvent;使用Psr\日志\LoggerInterface;类ConsoleExceptionListener{私人$日志记录器;公共函数__construct(LoggerInterface$日志记录器){$这->记录器=$日志记录器;}公共函数onConsoleException(ConsoleExceptionEvent$事件){$命令=$事件->getCommand ();$异常=$事件->getException ();$消息= sprintf ('%s: %s(未捕获的异常)在%s行%s处运行控制台命令'%s "get_class ($异常),$异常->getMessage (),$异常->getFile (),$异常->getLine (),$命令->getName ());$这->日志记录器->错误($消息,数组(“例外”= >$异常));}}
在上面的代码中,当任何命令抛出异常时,侦听器将接收到一个事件。您可以通过服务配置传递记录器服务来简单地记录它。您的方法接收一个ConsoleExceptionEvent对象,该对象具有获取有关事件和异常的信息的方法。
日志错误退出状态
控制台的日志记录功能可以通过返回错误退出状态的日志记录命令进一步扩展,该状态可以是与零不同的任意数字。这样,即使没有抛出异常,您也可以知道命令是否有任何错误。
首先在服务容器中为控制台终止事件配置监听器:
- YAML
- XML
- PHP
1 2 3 4 5 6 7
# app / config / services.yml服务:app.listener.command_error:类:AppBundle \ EventListener \ ErrorLoggerListener参数:(“@logger”)标签:-{名称:kernel.event_listener,事件:console.terminate}
然后实现实际的监听器:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/ / src / AppBundle / EventListener / ErrorLoggerListener.php名称空间AppBundle\EventListener;使用欧宝娱乐app下载地址\组件\控制台\事件\ConsoleTerminateEvent;使用Psr\日志\LoggerInterface;类ErrorLoggerListener{私人$日志记录器;公共函数__construct(LoggerInterface$日志记录器){$这->记录器=$日志记录器;}公共函数onConsoleTerminate(ConsoleTerminateEvent$事件){$statusCode=$事件->getExitCode ();$命令=$事件->getCommand ();如果($statusCode===0) {返回;}如果($statusCode>255) {$statusCode=255;$事件->setExitCode ($statusCode);}$这->日志记录器->警告(sprintf (命令“%s”退出,状态代码为%d”,$命令->getName (),$statusCode));}}