소스 검색

Added support of objects and arrays as values in LineFormatter. closes #19

Christophe Coevoet 14 년 전
부모
커밋
0775b03de0
2개의 변경된 파일60개의 추가작업 그리고 3개의 파일을 삭제
  1. 12 3
      src/Monolog/Formatter/LineFormatter.php
  2. 48 0
      tests/Monolog/Formatter/LineFormatterTest.php

+ 12 - 3
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);
+    }
 }

+ 48 - 0
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';
+    }
 }