如何启用登录控制台命令

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐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日志LoggerInterfaceGreetCommand扩展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名称空间AppBundleEventListener使用欧宝娱乐app下载地址组件控制台事件ConsoleExceptionEvent使用Psr日志LoggerInterfaceConsoleExceptionListener私人日志记录器公共函数__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名称空间AppBundleEventListener使用欧宝娱乐app下载地址组件控制台事件ConsoleTerminateEvent使用Psr日志LoggerInterfaceErrorLoggerListener私人日志记录器公共函数__construct(LoggerInterface日志记录器->记录器=日志记录器;}公共函数onConsoleTerminate(ConsoleTerminateEvent事件statusCode事件->getExitCode ();命令事件->getCommand ();如果statusCode===0) {返回;}如果statusCode>255) {statusCode255事件->setExitCode (statusCode);}->日志记录器->警告(sprintf (命令“%s”退出,状态代码为%d”命令->getName (),statusCode));}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。