diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown index ce5af4a4..3135b1d2 100644 --- a/CHANGELOG.mdown +++ b/CHANGELOG.mdown @@ -6,6 +6,7 @@ handle the given log level * Added ChromePHPHandler * Added MongoDBHandler + * Added SocketHandler (for use with syslog-ng for example) * Added NormalizerFormatter * Added the possibility to change the activation strategy of the FingersCrossedHandler * Added possibility to show microseconds in logs diff --git a/doc/sockets.md b/doc/sockets.md index b8028b52..fad30a9f 100644 --- a/doc/sockets.md +++ b/doc/sockets.md @@ -33,5 +33,5 @@ $logger->addInfo('My logger is now ready'); In this example, using syslog-ng, you should see the log on the log server: - cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] [] + cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] [] diff --git a/src/Monolog/Handler/SocketHandler.php b/src/Monolog/Handler/SocketHandler.php index bcb7466a..b44fad78 100644 --- a/src/Monolog/Handler/SocketHandler.php +++ b/src/Monolog/Handler/SocketHandler.php @@ -15,13 +15,12 @@ use Monolog\Logger; /** * Stores to any socket - uses fsockopen() or pfsockopen(). - * + * * @author Pablo de Leon Belloc * @see http://php.net/manual/en/function.fsockopen.php */ class SocketHandler extends AbstractProcessingHandler { - private $connectionString; private $connectionTimeout; private $resource; @@ -44,9 +43,9 @@ class SocketHandler extends AbstractProcessingHandler /** * Connect (if necessary) and write to the socket - * + * * @param array $record - * + * * @throws \UnexpectedValueException * @throws \RuntimeException */ @@ -61,10 +60,9 @@ class SocketHandler extends AbstractProcessingHandler */ public function close() { - if ($this->isPersistent()) { - return; + if (!$this->isPersistent()) { + $this->closeSocket(); } - $this->closeSocket(); } /** @@ -80,8 +78,8 @@ class SocketHandler extends AbstractProcessingHandler /** * Set socket connection to nbe persistent. It only has effect before the connection is initiated. - * - * @param type $boolean + * + * @param type $boolean */ public function setPersistent($boolean) { @@ -90,9 +88,9 @@ class SocketHandler extends AbstractProcessingHandler /** * Set connection timeout. Only has effect before we connect. - * - * @param integer $seconds - * + * + * @param integer $seconds + * * @see http://php.net/manual/en/function.fsockopen.php */ public function setConnectionTimeout($seconds) @@ -103,9 +101,9 @@ class SocketHandler extends AbstractProcessingHandler /** * Set write timeout. Only has effect before we connect. - * - * @param type $seconds - * + * + * @param type $seconds + * * @see http://php.net/manual/en/function.stream-set-timeout.php */ public function setTimeout($seconds) @@ -116,7 +114,7 @@ class SocketHandler extends AbstractProcessingHandler /** * Get current connection string - * + * * @return string */ public function getConnectionString() @@ -126,7 +124,7 @@ class SocketHandler extends AbstractProcessingHandler /** * Get persistent setting - * + * * @return boolean */ public function isPersistent() @@ -136,7 +134,7 @@ class SocketHandler extends AbstractProcessingHandler /** * Get current connection timeout setting - * + * * @return float */ public function getConnectionTimeout() @@ -146,7 +144,7 @@ class SocketHandler extends AbstractProcessingHandler /** * Get current in-transfer timeout - * + * * @return float */ public function getTimeout() @@ -156,19 +154,19 @@ class SocketHandler extends AbstractProcessingHandler /** * Check to see if the socket is currently available. - * + * * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. - * + * * @return boolean */ public function isConnected() { return is_resource($this->resource) - && !feof($this->resource); // on TCP - other party can close connection. + && !feof($this->resource); // on TCP - other party can close connection. } - + /** - * Allow mock + * Wrapper to allow mocking */ protected function pfsockopen() { @@ -176,7 +174,7 @@ class SocketHandler extends AbstractProcessingHandler } /** - * Allow mock + * Wrapper to allow mocking */ protected function fsockopen() { @@ -184,15 +182,15 @@ class SocketHandler extends AbstractProcessingHandler } /** - * Allow mock + * Wrapper to allow mocking */ - protected function stream_set_timeout() + protected function streamSetTimeout() { return stream_set_timeout($this->resource, $this->timeout); } /** - * Allow mock + * Wrapper to allow mocking */ protected function fwrite($data) { @@ -200,9 +198,9 @@ class SocketHandler extends AbstractProcessingHandler } /** - * Allow mock + * Wrapper to allow mocking */ - protected function stream_get_meta_data() + protected function streamGetMetadata() { return stream_get_meta_data($this->resource); } @@ -246,7 +244,7 @@ class SocketHandler extends AbstractProcessingHandler private function setSocketTimeout() { - if (!$this->stream_set_timeout()) { + if (!$this->streamSetTimeout()) { throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); } } @@ -261,7 +259,7 @@ class SocketHandler extends AbstractProcessingHandler throw new \RuntimeException("Could not write to socket"); } $sent += $chunk; - $socketInfo = $this->stream_get_meta_data(); + $socketInfo = $this->streamGetMetadata(); if ($socketInfo['timed_out']) { throw new \RuntimeException("Write timed-out"); } diff --git a/tests/Monolog/Handler/SocketHandlerTest.php b/tests/Monolog/Handler/SocketHandlerTest.php index eada7373..741a4123 100644 --- a/tests/Monolog/Handler/SocketHandlerTest.php +++ b/tests/Monolog/Handler/SocketHandlerTest.php @@ -19,7 +19,6 @@ use Monolog\Logger; */ class SocketHandlerTest extends TestCase { - /** * @var Monolog\Handler\SocketHandler */ @@ -107,9 +106,9 @@ class SocketHandlerTest extends TestCase */ public function testExceptionIsThrownIfCannotSetTimeout() { - $this->setMockHandler(array('stream_set_timeout')); + $this->setMockHandler(array('streamSetTimeout')); $this->handler->expects($this->once()) - ->method('stream_set_timeout') + ->method('streamSetTimeout') ->will($this->returnValue(false)); $this->writeRecord('Hello world'); } @@ -142,7 +141,7 @@ class SocketHandlerTest extends TestCase */ public function testWriteFailsIfStreamTimesOut() { - $this->setMockHandler(array('fwrite', 'stream_get_meta_data')); + $this->setMockHandler(array('fwrite', 'streamGetMetadata')); $callback = function($arg) { @@ -157,7 +156,7 @@ class SocketHandlerTest extends TestCase ->method('fwrite') ->will($this->returnCallback($callback)); $this->handler->expects($this->exactly(1)) - ->method('stream_get_meta_data') + ->method('streamGetMetadata') ->will($this->returnValue(array('timed_out' => true))); @@ -169,7 +168,7 @@ class SocketHandlerTest extends TestCase */ public function testWriteFailsOnIncompleteWrite() { - $this->setMockHandler(array('fwrite', 'stream_get_meta_data')); + $this->setMockHandler(array('fwrite', 'streamGetMetadata')); $res = $this->res; $callback = function($string) use ($res) @@ -182,7 +181,7 @@ class SocketHandlerTest extends TestCase ->method('fwrite') ->will($this->returnCallback($callback)); $this->handler->expects($this->exactly(1)) - ->method('stream_get_meta_data') + ->method('streamGetMetadata') ->will($this->returnValue(array('timed_out' => false))); $this->writeRecord('Hello world'); @@ -252,7 +251,7 @@ class SocketHandlerTest extends TestCase { $this->res = fopen('php://memory', 'a'); - $defaultMethods = array('fsockopen', 'pfsockopen', 'stream_set_timeout'); + $defaultMethods = array('fsockopen', 'pfsockopen', 'streamSetTimeout'); $newMethods = array_diff($methods, $defaultMethods); $finalMethods = array_merge($defaultMethods, $newMethods); @@ -273,9 +272,9 @@ class SocketHandlerTest extends TestCase ->will($this->returnValue($this->res)); } - if (!in_array('stream_set_timeout', $methods)) { + if (!in_array('streamSetTimeout', $methods)) { $this->handler->expects($this->any()) - ->method('stream_set_timeout') + ->method('streamSetTimeout') ->will($this->returnValue(true)); }