From 0775b03de0d6c7b46c86a0c8bcc7648ba628bc22 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sun, 8 May 2011 19:28:01 +0200 Subject: [PATCH] Added support of objects and arrays as values in LineFormatter. closes #19 --- src/Monolog/Formatter/LineFormatter.php | 15 ++++-- tests/Monolog/Formatter/LineFormatterTest.php | 48 +++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/Monolog/Formatter/LineFormatter.php b/src/Monolog/Formatter/LineFormatter.php index 48a4612d..7c6c3dcd 100644 --- a/src/Monolog/Formatter/LineFormatter.php +++ b/src/Monolog/Formatter/LineFormatter.php @@ -51,16 +51,16 @@ class LineFormatter implements FormatterInterface if (is_array($val)) { $strval = array(); foreach ($val as $subvar => $subval) { - $strval[] = $subvar.': '.$subval; + $strval[] = $subvar.': '.$this->convertToString($subval); } $replacement = $strval ? $var.'('.implode(', ', $strval).')' : ''; $output = str_replace('%'.$var.'%', $replacement, $output); } else { - $output = str_replace('%'.$var.'%', $val, $output); + $output = str_replace('%'.$var.'%', $this->convertToString($val), $output); } } foreach ($vars['extra'] as $var => $val) { - $output = str_replace('%extra.'.$var.'%', $val, $output); + $output = str_replace('%extra.'.$var.'%', $this->convertToString($val), $output); } return $output; @@ -75,4 +75,13 @@ class LineFormatter implements FormatterInterface return $message; } + + private function convertToString($data) + { + if (is_scalar($data) || (is_object($data) && method_exists($data, '__toString'))) { + return (string) $data; + } + + return serialize($data); + } } diff --git a/tests/Monolog/Formatter/LineFormatterTest.php b/tests/Monolog/Formatter/LineFormatterTest.php index 1724c8cd..a33b1cd8 100644 --- a/tests/Monolog/Formatter/LineFormatterTest.php +++ b/tests/Monolog/Formatter/LineFormatterTest.php @@ -56,4 +56,52 @@ class LineFormatterTest extends \PHPUnit_Framework_TestCase )); $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log extra(ip: 127.0.0.1)'."\n", $message); } + + public function testDefFormatWithObject() + { + $formatter = new LineFormatter(null, 'Y-m-d'); + $message = $formatter->format(array( + 'level_name' => 'ERROR', + 'channel' => 'meh', + 'datetime' => new \DateTime, + 'extra' => array('foo' => new TestFoo, 'bar' => new TestBar, 'baz' => array()), + 'message' => 'foobar', + )); + $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foobar extra(foo: O:25:"Monolog\\Formatter\\TestFoo":1:{s:3:"foo";s:3:"foo";}, bar: bar, baz: a:0:{})'."\n", $message); + } + + public function testBatchFormat() + { + $formatter = new LineFormatter(null, 'Y-m-d'); + $message = $formatter->formatBatch(array( + array( + 'level_name' => 'CRITICAL', + 'channel' => 'test', + 'message' => 'bar', + 'datetime' => new \DateTime, + 'extra' => array(), + ), + array( + 'level_name' => 'WARNING', + 'channel' => 'log', + 'message' => 'foo', + 'datetime' => new \DateTime, + 'extra' => array(), + ), + )); + $this->assertEquals('['.date('Y-m-d').'] test.CRITICAL: bar '."\n".'['.date('Y-m-d').'] log.WARNING: foo '."\n", $message); + } +} + +class TestFoo +{ + public $foo = 'foo'; +} + +class TestBar +{ + public function __toString() + { + return 'bar'; + } }