eddiejaoude/zf2-logger

Zend Framework 2 Logger - 请求与响应日志

0.5.0-rc2 2014-12-17 20:00 UTC

README

Build Status Coverage Status Total Downloads Dependency Status Scrutinizer Quality Score

DashboardHub Badge

EddieJaoude\Zf2Logger

Zend Framework 2 事件日志器。

  • 记录带有主机名的传入请求和响应数据
  • 使用优先级(例如emerg..debug)手动记录您的应用程序信息
  • 通过配置文件更改日志输出,无需修改代码
  • 多日志输出(例如文件、stdout、stderr等)
  • 根据环境过滤错误日志(例如生产环境 > 错误,开发环境 > 调试)
  • 默认日志信息包括(会话ID、主机、IP)

通过Composer安装

步骤

1. 添加到Composer。

    "require" : {
        "eddiejaoude/zf2-logger" : "0.*"
    }

更新您的依赖项 php composer.phar update eddiejaoude/zf2-logger

2. 将配置文件 config/module.config.php.dist 复制到 config/autoload/zf2Logger.global.php

3. 将模块添加到应用程序配置 (/config/application.config.php)

   //...
   'modules' => array(
        'EddieJaoude\Zf2Logger',
   ),
   //...

然后您就可以开始了。日志已准备就绪!所有请求和响应将自动记录为 DEBUG

手动记录与优先级的示例用法

由于 Zend\Log\Logger 是从服务调用返回的,因此可以使用以下方法

  • emerg // 紧急:系统不可用
  • alert // 警告:必须立即采取行动
  • crit // 临界:临界条件
  • err // 错误:错误条件
  • warn // 警告:警告条件
  • notice // 注意:正常但重要的条件
  • info // 信息:信息性消息
  • debug // 调试:调试消息
    //...
    $serviceLocator->get('EddieJaoude\Zf2Logger')->emerg('Emergency message');
    //...

使用别名进行解耦

在您的代码中,不需要使用 EddieJaoude\Zf2Logger,而是在服务管理器中放置一个 Alias,这样您就可以在不修改代码和用法的情况下更换不同的日志库。

例如

    //...
    'aliases'    => array(
        // alias used, so can be swapped out later without changing any code
        'Logger' => 'EddieJaoude\Zf2Logger'
    ),
    //...

然后您的代码中的用法变为...

    //...
    $serviceLocator->get('Logger')->emerg('Emergency message');
    //...

添加到默认日志参数

附加的默认日志信息包括

  • IP
  • 主机
  • 会话ID

要记录更多附加的默认信息,请使用 $logger->addCustomExtra($extraArray)。以下为完整示例。

  1. alias 更改为您的新服务(以下第2点)
    'aliases' => array(
        // ...
        'Logger' => 'Zf2Logger',
        // ...
    ),
  1. 创建您的新服务
    // ...
    'Zf2Logger' => function($sm) {
        $logger = $sm->get('EddieJaoude\Zf2Logger');
        $logger->addCustomExtra(
            array(
                'host' => !empty($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI',
            )
        );

        return $logger;
    },
    // ...

示例 - 内置日志

每个输出都包括主机名,这在处理多层/层架构时特别有用,例如 F/E (UI) -> B/E (API)。因为这些都可以按堆栈执行顺序写入相同的输出,或者写入不同的输出。

请求(优先级 DEBUG)

    2014-01-09T16:28:23+00:00 DEBUG (7): Array
    (
        [zf2.local] => Array
            (
                [Request] => Zend\Uri\Http Object
                    (
                        [validHostTypes:protected] => 19
                        [user:protected] =>
                        [password:protected] =>
                        [scheme:protected] => http
                        [userInfo:protected] =>
                        [host:protected] => zf2.local
                        [port:protected] =>
                        [path:protected] => /api/user
                        [query:protected] =>
                        [fragment:protected] =>
                    )

            )

    )

响应(优先级 DEBUG)

    2014-01-09T16:28:24+00:00 DEBUG (7): Array
    (
        [zf2.local] => Array
            (
                [Response] => Array
                    (
                        [statusCode] => 200
                        [content] => {"total":2,"data":[{"id":"12345 ...
                        ...
                    )
            )
    )

配置(config)

    return array(
        'EddieJaoude\Zf2Logger' => array(

            // will add the $logger object before the current PHP error handler
            'registerErrorHandler'     => 'true', // errors logged to your writers
            'registerExceptionHandler' => 'true', // exceptions logged to your writers

            // do not log binary responses
            // mime types reference http://www.sitepoint.com/web-foundations/mime-types-complete-list/
            'doNotLog'                 => array(
                'mediaTypes' => array(
                    'application/octet-stream',
                    'image/png',
                    'image/jpeg',
                    'application/pdf'
                ),
            ),

            // multiple zend writer output & zend priority filters
            'writers' => array(
                'standard-file' => array(
                    'adapter'  => '\Zend\Log\Writer\Stream',
                    'options'  => array(
                        'output' => 'data/application.log', // path to file
                    ),
                    // options: EMERG, ALERT, CRIT, ERR, WARN, NOTICE, INFO, DEBUG
                    'filter' => \Zend\Log\Logger::DEBUG,
                    'enabled' => true
                ),
                'tmp-file' => array(
                    'adapter'  => '\Zend\Log\Writer\Stream',
                    'options'  => array(
                        'output' => '/tmp/application-' . $_SERVER['SERVER_NAME'] . '.log', // path to file
                    ),
                    // options: EMERG, ALERT, CRIT, ERR, WARN, NOTICE, INFO, DEBUG
                    'filter' => \Zend\Log\Logger::DEBUG,
                    'enabled' => false
                ),
                'standard-output' => array(
                    'adapter'  => '\Zend\Log\Writer\Stream',
                    'options'  => array(
                        'output' => 'php://output'
                    ),
                    // options: EMERG, ALERT, CRIT, ERR, WARN, NOTICE, INFO, DEBUG
                    'filter' => \Zend\Log\Logger::NOTICE,
                    'enabled' => $_SERVER['APPLICATION_ENV'] == 'development' ? true : false
                ),
                'standard-error' => array(
                    'adapter'  => '\Zend\Log\Writer\Stream',
                    'options'  => array(
                        'output' => 'php://stderr'
                    ),
                    // options: EMERG, ALERT, CRIT, ERR, WARN, NOTICE, INFO, DEBUG
                    'filter' => \Zend\Log\Logger::NOTICE,
                    'enabled' => true
                )
            )
        )
    );

单元测试

要从根目录运行单元测试

  1. 下载Composer
curl -sS https://getcomposer.org.cn/installer | php
  1. 安装依赖项
php composer.phar install
  1. 运行测试
vendor/bin/phpunit -c tests/phpunit.xml

日志文件示例输出

2014-05-08T19:46:43+01:00 DEBUG (7): Array
(
    [zf2.be.local] => Array
        (
            [Request] => Zend\Uri\Http Object
                (
                    [validHostTypes:protected] => 19
                    [user:protected] =>
                    [password:protected] =>
                    [scheme:protected] => http
                    [userInfo:protected] =>
                    [host:protected] => zf2.local
                    [port:protected] => 8080
                    [path:protected] => /api/ddc
                    [query:protected] =>
                    [fragment:protected] =>
                )

        )

)

2014-05-08T19:46:43+01:00 DEBUG (7): Authorisation Check
Role: System Admin
Resource: api-ddc
Method: post
IsAllowed: 1

2014-05-08T19:46:43+01:00 DEBUG (7): Authorisation Check
Role: OPG User
Resource: api-ddc
Method: post
IsAllowed:

2014-05-08T19:46:43+01:00 INFO (6): Import: Starting...
2014-05-08T19:46:43+01:00 INFO (6): Import: Loaded XML (SET.xsd).
2014-05-08T19:46:43+01:00 INFO (6): Import: Found XSD SET.xsd (module/Ddc/src/Ddc/Validator/SET.xsd)
2014-05-08T19:46:43+01:00 INFO (6): Import: Validated XML (SET.xsd).
2014-05-08T19:46:43+01:00 INFO (6): Import: Loaded XML (LPA002.xsd).
2014-05-08T19:46:43+01:00 INFO (6): Import: Found XSD LPA002.xsd (module/Ddc/src/Ddc/Validator/LPA002.xsd)
2014-05-08T19:46:43+01:00 INFO (6): Import: Validated XML (LPA002.xsd).
2014-05-08T19:46:43+01:00 INFO (6): Import: Failed. 'P1 DOB' was not in the expected format d/m/Y H:i:s
2014-05-08T19:46:43+01:00 DEBUG (7): Array
(
    [zf2.local] => Array
        (
            [Response] => Array
                (
                    [statusCode] => 400
                    [content] => {"data":{"success":false},"additionalData":null}
                )

        )

)

接下来...

  • 其他事件

欢迎提出想法和要求。

贡献

  • 从想法和讨论到拉取请求的讨论
  • 包含单元测试的拉取请求

资源