Skip to content

Commit

Permalink
Added support of objects and arrays as values in LineFormatter. closes
Browse files Browse the repository at this point in the history
  • Loading branch information
stof committed May 8, 2011
1 parent 0ebdf69 commit 0775b03
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 3 deletions.
15 changes: 12 additions & 3 deletions src/Monolog/Formatter/LineFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,16 @@ public function format(array $record)
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;
Expand All @@ -75,4 +75,13 @@ public function formatBatch(array $records)

return $message;
}

private function convertToString($data)
{
if (is_scalar($data) || (is_object($data) && method_exists($data, '__toString'))) {
return (string) $data;
}

return serialize($data);
}
}
48 changes: 48 additions & 0 deletions tests/Monolog/Formatter/LineFormatterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,52 @@ public function testDefFormatExtras()
));
$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';
}
}

0 comments on commit 0775b03

Please sign in to comment.