文档章节

如何在command中使用log

汤汤圆圆
 汤汤圆圆
发布于 2015/12/15 23:04
字数 413
阅读 22
收藏 0

###1. 在命令行中手动记录日志

// src/AppBundle/Command/GreetCommand.php
namespace AppBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Psr\Log\LoggerInterface;

class GreetCommand extends ContainerAwareCommand #注意不是继承的Command类
{
    // ...

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        /** @var $logger LoggerInterface */
        $logger = $this->getContainer()->get('logger');//直接获取logger服务

        $name = $input->getArgument('name');
        if ($name) {
            $text = 'Hello '.$name;
        } else {
            $text = 'Hello';
        }

        if ($input->getOption('yell')) {
            $text = strtoupper($text);
            $logger->warning('Yelled: '.$text); //写日志
        } else {
            $logger->info('Greeted: '.$text);
        }

        $output->writeln($text);
    }
}

###2. 异常自动开启

####在服务容器中配置一个console.exception事件的监听者

# app/config/services.yml
services:
    kernel.listener.command_dispatch:
        class: AppBundle\EventListener\ConsoleExceptionListener
        arguments:
            logger: '@logger'
        tags:
            - { name: kernel.event_listener, event: console.exception }

####书写监听者类

// src/AppBundle/EventListener/ConsoleExceptionListener.php
namespace AppBundle\EventListener;

use Symfony\Component\Console\Event\ConsoleExceptionEvent;
use Psr\Log\LoggerInterface;

class ConsoleExceptionListener
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function onConsoleException(ConsoleExceptionEvent $event)
    {
        $command = $event->getCommand();
        $exception = $event->getException();

        $message = sprintf(
            '%s: %s (uncaught exception) at %s line %s while running console command `%s`',
            get_class($exception),
            $exception->getMessage(),
            $exception->getFile(),
            $exception->getLine(),
            $command->getName()
        );

        $this->logger->error($message, array('exception' => $exception));
    }
}

当任何一个命令抛出异常;该监听者就会接收到事件;事件会传递一个ConsoleExceptionEvent对象过来;根据该对象提供的信息记录日志

###记录非0退出状态

####配置一个console.terminate事件的监听者

services:
    kernel.listener.command_dispatch:
        class: AppBundle\EventListener\ErrorLoggerListener
        arguments:
            logger: '@logger'
        tags:
            - { name: kernel.event_listener, event: console.terminate }

####实现监听者

// src/AppBundle/EventListener/ErrorLoggerListener.php
namespace AppBundle\EventListener;

use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Psr\Log\LoggerInterface;

class ErrorLoggerListener
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function onConsoleTerminate(ConsoleTerminateEvent $event)
    {
        $statusCode = $event->getExitCode(); //退出状态码
        $command = $event->getCommand();

        if ($statusCode === 0) {
            return;
        }

        if ($statusCode > 255) {
            $statusCode = 255;
            $event->setExitCode($statusCode);
        }
        //记录退出状态吗
        $this->logger->warning(sprintf(
            'Command `%s` exited with status code %d',
            $command->getName(),
            $statusCode
        ));
    }
}

© 著作权归作者所有

汤汤圆圆

汤汤圆圆

粉丝 11
博文 82
码字总数 26104
作品 0
昌平
程序员
私信 提问
Android Bluetooth HCI log 详解

0. 引子 对于蓝牙开发者来说,通过HCI log可以帮助我们更好地分析问题,理解蓝牙协议,就好像网络开发一定要会使用Wireshark分析网络协议一样。 本篇主要介绍HCI log的作用、如何抓取一份HCI...

伤口不该结疤
2017/04/18
0
0
Redis如何分析慢查询操作?

什么是慢查询 和mysql的慢SQL日志分析一样,redis也有类似的功能,来帮助定位一些慢查询操作。 Redis slowlog是Redis用来记录查询执行时间的日志系统。 查询执行时间指的是不包括像客户端响应...

Java高级技术
2018/09/13
0
0
Mongodb源码分析--Command体系架构

Command在Mongodb中是一类特殊操作,它提供了强大的管理及各项操作(比如建库,索引,删除集合等)。可以说通过Command可以完成几乎所有想做的事情。同时Mongodb开发者在Command上又做了非常...

长平狐
2012/11/06
112
0
MySQL 5.5 服务器命令选项中文版(部分)

5.1.2 服务器命令选项 当您启动mysqld服务器时,你可以使用在4.2.3节“指定程序选项”中描述的任何方法指定程序选项。最常见的方法是在选项文件或命令行中提供 选项。然而,在大多数情况下都...

鉴客
2012/06/12
3.2K
0
PowerShell 学习笔记——使用帮助系统

“如果你不愿意花时间去阅读 PowerShell 的帮助文档,那么你就无法高效使用 PowerShell,也很难进一步学习如何使用它,更不用说使用它管理类似 Windows 或 Exchange 等产品,最终你无法摆脱使...

loveunicom
2017/10/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二叉查找树的第 K 个结点

private TreeNode ret;private int cnt = 0;public TreeNode KthNode(TreeNode pRoot, int k) { inOrder(pRoot, k); return ret;}private void inOrder(TreeNode root......

Garphy
49分钟前
4
0
windo8 weblogic

需要的软件包 现在安装jdk 则先进入你电脑自带jdk \bin目录下 然后java -jar 执行你的jar包就可以了 欢迎界面直接点击下一步,跳到更新界面,直接选择跳过 然后选择安装目录(注意:目录不要有...

恩多
56分钟前
6
0
Activiti 批注

Activiti添加批注(comment)信息 在每次提交任务的时候需要描述一些批注信息,例如:请假流程提交的时候要描述信息为什么请假,如果领导驳回可以批注驳回原因等  1、添加批注 // 由于流程...

奔跑的android
今天
4
0
centos7命令行和图形界面的相互切换

最近安装了centos7,发现在命令行和图形界面的相互切换命令上,与centos以往版本有很大不同。 1,centos7默认安装后,跟其他版本一样,启动默认进入图形界面; 2,在图形化桌面,右击鼠标,选...

无名氏的程序员
今天
6
0
快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么

一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在...

Bb进阶
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部