如何启用登录控制台命令吗
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
如何启用登录控制台命令吗
控制台组件没有提供任何的日志记录功能。通常,你手动运行控制台命令并观察输出,这就是为什么没有提供日志记录。然而,在某些情况下,您可能需要日志记录。举个例子,如果你是无人值守运行控制台命令,如从cron作业或部署脚本,它可能更容易使用Symfony的配置日志功能而不是其他工具来收集控制台输出和处理它。ob娱乐下载这可以特别是一些如果你已经有一些现有的设置为聚集和分析Symfony日志。ob娱乐下载
- 基本上有两种日志记录情况下,您需要:
-
- 手动记录一些信息从你的命令;
- 日志未捕获的异常。
从控制台命令手动记录
这是很简单的。当您创建一个完整的框架内控制台命令中所描述的“如何创建一个控制台命令吗”,你的命令扩展ContainerAwareCommand。这意味着您可以简单地通过容器访问标准记录器服务并使用它的日志:
1 2 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 33 34 35 36 37
/ / src / Acme / DemoBundle /命令/ GreetCommand.php名称空间Acme\DemoBundle\命令;使用ob娱乐下载\包\FrameworkBundle\命令\ContainerAwareCommand;使用ob娱乐下载\组件\控制台\输入\InputArgument;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输入\InputOption;使用ob娱乐下载\组件\控制台\输出\OutputInterface;使用ob娱乐下载\组件\HttpKernel\日志\LoggerInterface;类GreetCommand扩展ContainerAwareCommand{/ /……受保护的函数执行(InputInterface美元输入,OutputInterface美元输出){/ * *@var记录器LoggerInterface * /美元美元日志记录器=美元这- >getContainer ()- >get (“日志”);美元的名字=美元输入- >getArgument (“名字”);如果(美元的名字){美元文本=“你好”。美元的名字;}其他的{美元文本=“你好”;}如果(美元输入- >getOption (“喊”)){美元文本= strtoupper (美元文本);美元日志记录器- >警告(“喊道:”。美元文本);}其他的{美元日志记录器- >信息(”迎接:“。美元文本);}美元输出- >writeln (美元文本);}}
取决于你的环境运行你的命令(日志记录设置),您应该看到记录的条目应用程序/日志/ dev.log
或应用程序/日志/ prod.log
。
启用自动异常日志
让你的控制台应用程序自动日志未捕获的异常为所有你的命令,你需要做一点工作。
首先,创建一个新的子类应用程序和覆盖它run ()异常处理方法,会发生:
谨慎
由于核心的本质应用程序类,大部分的运行方法是重复的,甚至一个私人财产originalAutoExit
重新实现。这是你的一个例子可以做在你的代码中,尽管是一个风险很高,有可能打破当升级到Symfony的未来版本。ob娱乐下载
1 2 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
/ / src / Acme / DemoBundle /控制台/ Application.php名称空间Acme\DemoBundle\控制台;使用ob娱乐下载\包\FrameworkBundle\控制台\应用程序作为BaseApplication;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;使用ob娱乐下载\组件\控制台\输出\ConsoleOutputInterface;使用ob娱乐下载\组件\HttpKernel\日志\LoggerInterface;使用ob娱乐下载\组件\HttpKernel\KernelInterface;使用ob娱乐下载\组件\控制台\输出\ConsoleOutput;使用ob娱乐下载\组件\控制台\输入\ArgvInput;类应用程序扩展BaseApplication{私人美元originalAutoExit;公共函数__construct(KernelInterface美元内核){父::__construct (美元内核);美元这- >originalAutoExit =真正的;}/ * * *运行当前的应用程序。* *@paramInputInterface美元*输入一个实例@param* * OutputInterface美元输出输出实例@return整数0如果所有事情都很顺利,或者一个错误代码* *@throws* * \例外当doRun返回异常@api* /公共函数运行(InputInterface美元输入= null, OutputInterface美元输出= null){/ /父类方法抛出异常,所以你可以需要进行日志记录美元这- >setCatchExceptions (假);如果(零= = =美元输入){美元输入=新ArgvInput ();}如果(零= = =美元输出){美元输出=新ConsoleOutput ();}试一试{美元statusCode=父::运行(美元输入,美元输出);}抓(\异常美元e){/ * *@var记录器LoggerInterface * /美元美元日志记录器=美元这- >getKernel ()- >getContainer ()- >get (“日志”);美元消息= sprintf (' % s: % s(异常)% s % s而运行控制台命令“% s”get_class (美元e),美元e- >getMessage (),美元e- >getFile (),美元e- >getLine (),美元这- >getCommandName (美元输入));美元日志记录器- >暴击(美元消息);如果(美元输出运算符ConsoleOutputInterface) {美元这- >renderException (美元e,美元输出- >getErrorOutput ());}其他的{美元这- >renderException (美元e,美元输出);}美元statusCode=美元e- >getCode ();美元statusCode= is_numeric (美元statusCode)& &美元statusCode吗?美元statusCode:1;}如果(美元这- >originalAutoExit) {如果(美元statusCode>255年){美元statusCode=255年;}/ / @codeCoverageIgnoreStart退出(美元statusCode);/ / @codeCoverageIgnoreEnd}返回美元statusCode;}公共函数setAutoExit(美元bool){/ /父属性是私人的,所以我们需要拦截setter美元这- >originalAutoExit =(布尔)美元bool;父::setAutoExit (美元bool);}}
在上面的代码中,您禁用异常捕获所以父运行
方法将抛出所有的异常。当发现一个异常时,你简单的访问日志日志记录器
服务从服务容器,然后以同样的方式处理其余的逻辑的父母运行
方法(特别是自父母运行方法将不处理异常呈现和状态码处理时catchExceptions
设置为false,它必须做的覆盖方法)。
扩展应用程序类和在控制台shell模式下正常工作,你必须做一个小技巧拦截autoExit
setter和存储设置在一个不同的属性,因为父产权是私有的。
现在能够使用你的扩展应用程序
类需要调整app /控制台
脚本使用新的类,而不是默认的
1 2 3 4 5 6 7 8
/ /应用程序/控制台/ /……/ /替换以下行:/ /使用Syob娱乐下载mfony \ \包\ FrameworkBundle \控制台应用程序;使用Acme\DemoBundle\控制台\应用程序;/ /……
就是这样!由于自动装卸机,你的类将被用来代替原来的。
记录非0的退出状态
控制台的日志功能可以进一步延长记录非0的退出状态。这样你就会知道如果一个命令有错误,即使没有异常被抛出。
为了做到这一点,您必须修改run ()
你的扩展方法应用程序
类以下列方式:
1 2 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
公共函数运行(InputInterface美元输入= null, OutputInterface美元输出= null){/ /父类方法抛出异常,所以你可以需要进行日志记录美元这- >setCatchExceptions (假);/ /存储autoExit——你需要它之前重置价值美元autoExit=美元这- >originalAutoExit;美元这- >setAutoExit (假);/ /……如果(美元autoExit){如果(美元statusCode>255年){美元statusCode=255年;}/ /日志非零退出代码和命令名如果(美元statusCode= = !0){/ * *@var记录器LoggerInterface * /美元美元日志记录器=美元这- >getKernel ()- >getContainer ()- >get (“日志”);美元日志记录器- >警告(sprintf (‘命令’% s的退出状态码% d ',美元这- >getCommandName (美元输入),美元statusCode));}/ / @codeCoverageIgnoreStart退出(美元statusCode);/ / @codeCoverageIgnoreEnd}返回美元statusCode;}