<?php /* * 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. */ namespace Monolog\Handler; use Monolog\Logger; /** * 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 StreamHandler extends AbstractProcessingHandler { protected $stream; protected $url; private $errorMessage; protected $filePermission; protected $useLocking; private $dirCreated; /** * @param resource|string $stream * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param bool $useLocking Try to lock log file before doing any writes * * @throws \Exception If a missing directory is not buildable * @throws \InvalidArgumentException If stream is not a resource or string */ public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) { parent::__construct($level, $bubble); if (is_resource($stream)) { $this->stream = $stream; } elseif (is_string($stream)) { $this->url = $stream; } else { throw new \InvalidArgumentException('A stream must either be a resource or a string.'); } $this->filePermission = $filePermission; $this->useLocking = $useLocking; } /** * {@inheritdoc} */ public function close() { if ($this->url && is_resource($this->stream)) { fclose($this->stream); } $this->stream = null; } /** * Return the currently active stream if it is open * * @return resource|null */ public function getStream() { return $this->stream; } /** * Return the stream URL if it was configured with a URL and not an active resource * * @return string|null */ public function getUrl() { return $this->url; } /** * {@inheritdoc} */ protected function write(array $record) { if (!is_resource($this->stream)) { if (null === $this->url || '' === $this->url) { throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().'); } $this->createDir(); $this->errorMessage = null; set_error_handler(array($this, 'customErrorHandler')); $this->stream = fopen($this->url, 'a'); if ($this->filePermission !== null) { @chmod($this->url, $this->filePermission); } restore_error_handler(); if (!is_resource($this->stream)) { $this->stream = null; throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url)); } } if ($this->useLocking) { // ignoring errors here, there's not much we can do about them flock($this->stream, LOCK_EX); } $this->streamWrite($this->stream, $record); if ($this->useLocking) { flock($this->stream, LOCK_UN); } } /** * Write to stream * @param resource $stream * @param array $record */ protected function streamWrite($stream, array $record) { fwrite($stream, (string) $record['formatted']); } private function customErrorHandler($code, $msg) { $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); } /** * @param string $stream * * @return null|string */ private function getDirFromStream($stream) { $pos = strpos($stream, '://'); if ($pos === false) { return dirname($stream); } if ('file://' === substr($stream, 0, 7)) { return dirname(substr($stream, 7)); } return; } private function createDir() { // Do not try to create dir if it has already been tried. if ($this->dirCreated) { return; } $dir = $this->getDirFromStream($this->url); if (null !== $dir && !is_dir($dir)) { $this->errorMessage = null; set_error_handler(array($this, 'customErrorHandler')); $status = mkdir($dir, 0777, true); restore_error_handler(); if (false === $status && !is_dir($dir)) { throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and its not buildable: '.$this->errorMessage, $dir)); } } $this->dirCreated = true; } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
Curl | Folder | 0755 |
|
|
FingersCrossed | Folder | 0755 |
|
|
Slack | Folder | 0755 |
|
|
SyslogUdp | Folder | 0755 |
|
|
AbstractHandler.php | File | 4.28 KB | 0644 |
|
AbstractProcessingHandler.php | File | 1.5 KB | 0644 |
|
AbstractSyslogHandler.php | File | 3.29 KB | 0644 |
|
AmqpHandler.php | File | 3.78 KB | 0644 |
|
BrowserConsoleHandler.php | File | 7.21 KB | 0644 |
|
BufferHandler.php | File | 3.58 KB | 0644 |
|
ChromePHPHandler.php | File | 5.48 KB | 0644 |
|
CouchDBHandler.php | File | 1.91 KB | 0644 |
|
CubeHandler.php | File | 4.52 KB | 0644 |
|
DeduplicationHandler.php | File | 5.35 KB | 0644 |
|
DoctrineCouchDBHandler.php | File | 1000 B | 0644 |
|
DynamoDbHandler.php | File | 2.38 KB | 0644 |
|
ElasticSearchHandler.php | File | 3.33 KB | 0644 |
|
ErrorLogHandler.php | File | 2.31 KB | 0644 |
|
FilterHandler.php | File | 4.32 KB | 0644 |
|
FingersCrossedHandler.php | File | 5.77 KB | 0644 |
|
FirePHPHandler.php | File | 5.33 KB | 0644 |
|
FleepHookHandler.php | File | 3.28 KB | 0644 |
|
FlowdockHandler.php | File | 3.28 KB | 0644 |
|
GelfHandler.php | File | 1.91 KB | 0644 |
|
GroupHandler.php | File | 2.69 KB | 0644 |
|
HandlerInterface.php | File | 2.53 KB | 0644 |
|
HandlerWrapper.php | File | 2.31 KB | 0644 |
|
HipChatHandler.php | File | 10.51 KB | 0644 |
|
IFTTTHandler.php | File | 2.06 KB | 0644 |
|
InsightOpsHandler.php | File | 1.83 KB | 0644 |
|
LogEntriesHandler.php | File | 1.58 KB | 0644 |
|
LogglyHandler.php | File | 2.56 KB | 0644 |
|
MailHandler.php | File | 1.58 KB | 0644 |
|
MandrillHandler.php | File | 2.11 KB | 0644 |
|
MissingExtensionException.php | File | 450 B | 0644 |
|
MongoDBHandler.php | File | 1.57 KB | 0644 |
|
NativeMailerHandler.php | File | 5.08 KB | 0644 |
|
NewRelicHandler.php | File | 6.06 KB | 0644 |
|
NullHandler.php | File | 953 B | 0644 |
|
PHPConsoleHandler.php | File | 9.76 KB | 0644 |
|
PsrHandler.php | File | 1.4 KB | 0644 |
|
PushoverHandler.php | File | 6.47 KB | 0644 |
|
RavenHandler.php | File | 6.96 KB | 0644 |
|
RedisHandler.php | File | 2.82 KB | 0644 |
|
RollbarHandler.php | File | 3.85 KB | 0644 |
|
RotatingFileHandler.php | File | 5.75 KB | 0644 |
|
SamplingHandler.php | File | 2.61 KB | 0644 |
|
SlackHandler.php | File | 6.3 KB | 0644 |
|
SlackWebhookHandler.php | File | 3.73 KB | 0644 |
|
SlackbotHandler.php | File | 1.98 KB | 0644 |
|
SocketHandler.php | File | 9.58 KB | 0644 |
|
StreamHandler.php | File | 5.1 KB | 0644 |
|
SwiftMailerHandler.php | File | 3.36 KB | 0644 |
|
SyslogHandler.php | File | 1.8 KB | 0644 |
|
SyslogUdpHandler.php | File | 2.51 KB | 0644 |
|
TestHandler.php | File | 5.01 KB | 0644 |
|
WhatFailureGroupHandler.php | File | 1.76 KB | 0644 |
|
ZendMonitorHandler.php | File | 2.19 KB | 0644 |
|