ChristianB 13 лет назад
Родитель
Сommit
a82bac49f2

+ 86 - 0
src/Monolog/Handler/ZendMonitorHandler.php

@@ -0,0 +1,86 @@
+<?php
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+
+/**
+ * Handler sending logs to Zend Monitor
+ *
+ * @author  Christian Bergau <cbergau86@gmail.com>
+ */
+class ZendMonitorHandler extends AbstractProcessingHandler
+{
+    /**
+     * Monolog level / ZendMonitor Custom Event priority map
+     *
+     * @var array
+     */
+    protected $levelMap = array(
+        Logger::DEBUG     => 1,
+        Logger::INFO      => 2,
+        Logger::NOTICE    => 3,
+        Logger::WARNING   => 4,
+        Logger::ERROR     => 5,
+        Logger::CRITICAL  => 6,
+        Logger::ALERT     => 7,
+        Logger::EMERGENCY => 0,
+    );
+
+    /**
+     * Is application running on a zend server?
+     *
+     * @var bool
+     */
+    protected $isZendServer = false;
+
+    /**
+     * Construct
+     *
+     * @param   int     $level
+     * @param   bool    $bubble
+     */
+    public function __construct($level = Logger::DEBUG, $bubble = true)
+    {
+        $this->isZendServer = function_exists('zend_monitor_custom_event');
+        parent::__construct($level, $bubble);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function write(array $record)
+    {
+        if ($this->isZendServer()) {
+            $this->writeZendMonitorCustomEvent($record);
+        }
+    }
+
+    /**
+     * Write a record to Zend Monitor
+     *
+     * @param   array   $record
+     */
+    protected function writeZendMonitorCustomEvent(array $record)
+    {
+        zend_monitor_custom_event($this->levelMap[$record['level']], $record['message'], $record);
+    }
+
+    /**
+     * Is Zend Server?
+     *
+     * @return bool
+     */
+    public function isZendServer()
+    {
+        return $this->isZendServer;
+    }
+}

+ 62 - 0
tests/Monolog/Handler/ZendMonitorHandlerTest.php

@@ -0,0 +1,62 @@
+<?php
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Handler;
+
+use Monolog\Logger;
+use Monolog\TestCase;
+
+class ZendMonitorHandlerTest extends TestCase
+{
+    protected $zendMonitorHandler;
+
+    public function setUp()
+    {
+        if (!function_exists('zend_monitor_custom_event')) {
+            $this->markTestSkipped('ZendServer is not installed');
+        }
+    }
+
+    /**
+     * @covers  \Monolog\Handler\ZendMonitor::__construct
+     * @covers  \Monolog\Handler\ZendMonitor::isZendServer
+     */
+    public function testIsZendServerReturnsTrue()
+    {
+        $zendMonitor = $this->getMockBuilder('Monolog\Handler\ZendMonitorHandler')
+            ->setMethods(null)
+            ->getMock();
+        $this->assertTrue($zendMonitor->isZendServer());
+    }
+
+    /**
+     * @covers  \Monolog\Handler\ZendMonitor::write
+     */
+    public function testWrite()
+    {
+        $zendMonitor = $this->getMockBuilder('Monolog\Handler\ZendMonitorHandler')
+            ->setMethods(array('writeZendMonitorCustomEvent'))
+            ->getMock();
+        $zendMonitor->expects($this->once())
+            ->method('writeZendMonitorCustomEvent');
+        $zendMonitor->handle(
+            array(
+                'message'    => 'addDebug Message',
+                'context'    => array(),
+                'level'      => Logger::DEBUG,
+                'level_name' => 'DEBUG',
+                'channel'    => 'zendmonitor',
+                'extra'      => array(),
+                'formatted'  => '[2013-01-30 19:07:32] zendmonitor.DEBUG: addDebug Message [] []'
+            )
+        );
+    }
+
+}