oras/monolog-middleware

PSR-7 Monolog 中间件

v3.0.0 2018-03-22 14:57 UTC

README

Build Status Latest Stable Version Total Downloads License

Monolog 日志中间件

用于与 PSR-7 中间件框架(如 Zend Expressive 和 Slim)一起使用的 Monolog 中间件。

现在它支持 Zend Expressive 3.*

要使用 Zend Expressive 1.*,请安装版本 1.1.4。要使用 Zend Expressive 2.*,请安装版本 2.0.0

loggables 设置灵感来自 Guzzle 日志格式。您可以通过配置文件设置任何请求/响应/头中的数据,而不是在代码中设置,从而根据您的需求提供更多灵活性,以记录更多/更少的日志。

安装

1) 使用 composer 安装中间件
composer require oras/monolog-middleware
2) 添加配置

然后在您的 Zend Expressive config/autoload/ 目录中,创建一个新的配置文件,命名为:logger.local.php

作为一个起点,您可以在文件中添加以下内容

use Monolog\Logger;

return [
    'monolog' =>
        [
            'logger_name' => 'MyLog',
            'loggables' => '[{host}] {request}/{response}', // optional and current one is default format that will be logged
            'handlers' =>
                [
                    'main'   =>
                        [
                            'type'   => 'stream',
                            'path'   => "data/main.log",
                            'level'  => Logger::DEBUG,
                            'bubble' => true,
                        ],
                ],
        ],
];

请参阅末尾的 Loggables 列表以获取所有可能的变量。

3) 将工厂和中间件添加到 dependencies.global.php 文件中,如下所示
'factories' => [

            \MonologMiddleware\MonologMiddleware::class => \MonologMiddleware\Factory\MonologMiddlewareFactory::class,
        ],
4) 现在要开始记录中间件的请求/响应日志,只需在路由之后放置以下行即可。

示例

'routes' => [
        [
            'name' => 'home',
            'path' => '/',
            'middleware' => [
               App\Action\HomePageAction::class,
               \MonologMiddleware\MonologMiddleware::class,
               ],
            'allowed_methods' => ['GET'],
        ],
];

现在每次调用路由 / 时,您将获得请求和响应的日志。

默认情况下,MonologMiddleware 将以调试模式记录日志。如果您想处理不同的级别,只需更改配置中的 level

需求

  • PHP >= 7.1

配置示例

Monolog 中间件中每个实现的处理器的完整示例。请注意,这些可能不是 Monolog 支持的所有处理器,只是在这个中间件中实现的。

除非另有说明,否则所有行都是必需的。

$streamHandler = [
'main'   =>
    [
        'type'   => 'stream',
        'path'   => 'data/main.log',
        'level'  => Logger::DEBUG,
        'bubble' => true, // optional
    ],
];
Loggly
$logglyHandler = [
'loggly'   =>
    [
        'type'   => 'loggly',
        'token'   => 'your-loggly-token',
        'level'  => Logger::DEBUG,
        'bubble' => true, //optional
    ],
];
Slack
$slackHandler = [
'slack'   =>
    [
        'type'       => 'slack',
        'token'      => 'your-slack-token',
        'channel'    => '#your-slack-channel',
        'level'      => Logger::DEBUG,
        'icon_emoji' => '::ghost::', // optional
        'bubble'     => true, // optional
    ],
];
Pushover
$pushOverHandler = [
'pushover'   =>
    [
        'type'    => 'pushover',
        'token'   => 'your-pushover-token',
        'user'    => 'pushover user',
        'level'   => Logger::ERROR,
        'title'   => 'Log title', // optional
        'bubble'  => true, // optional
    ],
];
本地电子邮件处理器
$nativeEmailHandler = [
'native_email'   =>
    [
        'type'             => 'native_email',
        'level'            => Logger::CRITICAL,
        'from_email'       => 'logs@yourserver.com',
        'to_email'         => 'email@email.com',
        'subject'          => 'Email subject', // optional
        'max_column_width' => 70, //optional
        'bubble'           => true, // optional
    ],
];
浏览器控制台处理器
$browserConsoleHandler = [
'browser_console'   =>
    [
        'type'    => 'browser_console',
        'level'   => Logger::DEBUG,
    ],
];
Redis 处理器
$redisHandler = [
'redis'   =>
    [
        'type'          => 'redis',
        'level'         => Logger::DEBUG,
        'redis_client'  => new \Redis(),
        'key'           => 'monolog',
    ],
];
FirePHP 处理器
$redisHandler = [
'firephp'   =>
    [
        'type'          => 'firephp',
        'level'         => Logger::DEBUG,
    ],
];
NewRelic 处理器
$redisHandler = [
'new_relic'   =>
    [
        'type'          => 'new_relic',
        'level'         => Logger::DEBUG,
        'app_name'      => 'Monolog', // optional
    ],
];

Loggables 列表

要记录请求/响应正文,可以在 format 设置中使用 {req_body}{res_body}

日志变量的完整列表及说明

扩展中间件

要扩展中间件以记录您自己的格式或特定数据(如 cookies、服务器参数等),您可以轻松地使用以下步骤

  1. 创建一个工厂类。我将其命名为 MyMonologMiddlewareFactory,它将调用一个 MyMonologMiddleware 类,该类将作为您定制的中间件以记录。
class MyMonologMiddlewareFactory
{

    /**
     * @param ContainerInterface $serviceContainer
     * @return MonologMiddleware
     * @throws MonologConfigException
     */
    public function __invoke(ContainerInterface $serviceContainer)
    {
        $config = $serviceContainer->get('config');
        if (null === $config) {
            throw new MonologConfigException("Can not find monolog configuration in your config. Make sure to have monolog configuration array in your config");
        }

        $helper = new MonologConfigurationExtension($config['monolog']);
        $logHandlers = $helper->getLogHandlers();
        $loggerName = (isset($config['monolog']['logger_name']) ? $config['monolog']['logger_name'] : 'monolog');
        /**
         * @var Logger
         */
        $monologLogger = new Logger($loggerName);
        $monologLogger->setHandlers($logHandlers);

        return new MyMonologMiddleware($monologLogger);
    }
}
  1. 创建中间件类
class MonologMiddleware implements MiddlewareInterface
{
    /**
     * @var Logger
     */
    protected $logger;

    /**
     * MonologMiddleware constructor.
     * @param Logger $logger
     */
    public function __construct(Logger $logger)
    {
        $this->logger = $logger;
    }


    /**
     * @param ServerRequestInterface $request
     * @param ResponseInterface $response
     * @param callable $next
     * @return mixed
     */
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next = null)
    {
        // Here you set logger level, message or any data that you'd like from your request or response.
        // For example, I am going to log cookie params

        $this->logger->addInfo(Logger::INFO, implode(", ", $request->getCookieParams());
        return $next($request, $response);
    }

}
  1. 将您的工厂和中间件添加到全局依赖文件中。假设您的中间件和工厂在同一个目录中,配置将是
    'factories' => [
            MyMonologMiddleware::class => MyMonologMiddlewareFactory::class,
    ],

就是这样...您已经准备好使用您自己的定制日志记录器了。

Monolog Middleware 是在我通勤时编写的。在西南列车上充满激情地编写。 请注意间隙!