public function testFormatAllTypes() { $datetime = new DateTime(); $object = new stdClass(); $object->foo = 'bar'; $formatter = new BaseFormatter(); $event = array('timestamp' => $datetime, 'priority' => 1, 'message' => 'tottakai', 'extra' => array('float' => 0.2, 'boolean' => false, 'array_empty' => array(), 'array' => range(0, 4), 'traversable_empty' => new EmptyIterator(), 'traversable' => new ArrayIterator(array('id', 42)), 'null' => null, 'object_empty' => new stdClass(), 'object' => $object, 'string object' => new StringObject(), 'resource' => fopen('php://stdout', 'w'))); $outputExpected = array('timestamp' => $datetime->format($formatter->getDateTimeFormat()), 'priority' => 1, 'message' => 'tottakai', 'extra' => array('boolean' => false, 'float' => 0.2, 'array_empty' => '[]', 'array' => '[0,1,2,3,4]', 'traversable_empty' => '[]', 'traversable' => '["id",42]', 'null' => null, 'object_empty' => 'object(stdClass) {}', 'object' => 'object(stdClass) {"foo":"bar"}', 'string object' => 'Hello World', 'resource' => 'resource(stream)')); $this->assertEquals($outputExpected, $formatter->format($event)); }
/** * Class constructor * * @see http://php.net/manual/en/function.date.php * @param null|string $format Format specifier for log messages * @param null|string $dateTimeFormat Format specifier for DateTime objects in event data * @throws Exception\InvalidArgumentException */ public function __construct($format = null, $dateTimeFormat = null) { if ($format instanceof \Traversable) { $format = iterator_to_array($format); } if (is_array($format)) { $dateTimeFormat = isset($format['dateTimeFormat']) ? $format['dateTimeFormat'] : null; $format = isset($format['format']) ? $format['format'] : null; } if (isset($format) && !is_string($format)) { throw new Exception\InvalidArgumentException('Format must be a string'); } $this->format = isset($format) ? $format : static::DEFAULT_FORMAT; parent::__construct($dateTimeFormat); }
/** * Formats data into a single line to be written by the writer. * * @param array $event event data * @return string formatted line to write to the log */ public function format($event) { $output = $this->format; $event = parent::format($event); foreach ($event as $name => $value) { if ('extra' == $name && count($value)) { $value = $this->normalize($value); } elseif ('extra' == $name) { // Don't print an empty array $value = ''; } $output = str_replace("%{$name}%", $value, $output); } if (isset($event['extra']) && empty($event['extra']) && false !== strpos($this->format, '%extra%')) { $output = rtrim($output, ' '); } return $output; }
public function testFormatExtraArrayKeyWithNonArrayValue() { $formatter = new BaseFormatter(); $event = array('message' => 'Hi', 'extra' => ''); $outputExpected = array('message' => 'Hi', 'extra' => ''); $this->assertEquals($outputExpected, $formatter->format($event)); }