* This file is part of the Monolog package.
* (c) Jordi Boggiano <j.boggiano@seld.be>
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
* Stores to any stream resource
* Can be used to store into php://stderr, remote and local files, etc.
* @author Jordi Boggiano <j.boggiano@seld.be>
class Monolog_Handler_StreamHandler extends Monolog_Handler_AbstractProcessingHandler
* @param integer $level The minimum logging level at which this handler will be triggered
* @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
public function __construct($stream, $level = Monolog_Logger::DEBUG, $bubble = true)
parent::__construct($level, $bubble);
if (is_resource($stream)) {
if (is_resource($this->stream)) {
protected function write(array $record)
if (null === $this->stream) {
throw new LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().');
$this->errorMessage = null;
set_error_handler(array($this, 'customErrorHandler'));
$this->stream = fopen($this->url, 'a');
if (!is_resource($this->stream)) {
throw new UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url));
fwrite($this->stream, (string) $record['formatted']);
private function customErrorHandler($code, $msg)
$this->errorMessage = preg_replace('{^fopen\(.*?\): }', '', $msg);