UnexpectedValueException
The stream or file "/var/www/fscoceans/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied UnexpectedValueException thrown with message "The stream or file "/var/www/fscoceans/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied" Stacktrace: #14 UnexpectedValueException in /var/www/fscoceans/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:111 #13 Monolog\Handler\StreamHandler:write in /var/www/fscoceans/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php:42 #12 Monolog\Handler\AbstractProcessingHandler:handle in /var/www/fscoceans/vendor/monolog/monolog/src/Monolog/Logger.php:317 #11 Monolog\Logger:addRecord in /var/www/fscoceans/vendor/monolog/monolog/src/Monolog/Logger.php:578 #10 Monolog\Logger:emergency in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/Logger.php:176 #9 Illuminate\Log\Logger:writeLog in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/Logger.php:51 #8 Illuminate\Log\Logger:emergency in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/LogManager.php:124 #7 Illuminate\Log\LogManager:Illuminate\Log\{closure} in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Support/helpers.php:422 #6 tap in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/LogManager.php:126 #5 Illuminate\Log\LogManager:get in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/LogManager.php:98 #4 Illuminate\Log\LogManager:driver in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/LogManager.php:547 #3 Illuminate\Log\LogManager:error in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php:122 #2 Illuminate\Foundation\Exceptions\Handler:report in /var/www/fscoceans/app/Exceptions/Handler.php:35 #1 App\Exceptions\Handler:report in /var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php:92 #0 Illuminate\Foundation\Bootstrap\HandleExceptions:handleException in [internal]:0
14
UnexpectedValueException
/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php111
13
Monolog\Handler\StreamHandler write
/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php42
12
Monolog\Handler\AbstractProcessingHandler handle
/vendor/monolog/monolog/src/Monolog/Logger.php317
11
Monolog\Logger addRecord
/vendor/monolog/monolog/src/Monolog/Logger.php578
10
Monolog\Logger emergency
/vendor/laravel/framework/src/Illuminate/Log/Logger.php176
9
Illuminate\Log\Logger writeLog
/vendor/laravel/framework/src/Illuminate/Log/Logger.php51
8
Illuminate\Log\Logger emergency
/vendor/laravel/framework/src/Illuminate/Log/LogManager.php124
7
Illuminate\Log\LogManager Illuminate\Log\{closure}
/vendor/laravel/framework/src/Illuminate/Support/helpers.php422
6
tap
/vendor/laravel/framework/src/Illuminate/Log/LogManager.php126
5
Illuminate\Log\LogManager get
/vendor/laravel/framework/src/Illuminate/Log/LogManager.php98
4
Illuminate\Log\LogManager driver
/vendor/laravel/framework/src/Illuminate/Log/LogManager.php547
3
Illuminate\Log\LogManager error
/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php122
2
Illuminate\Foundation\Exceptions\Handler report
/app/Exceptions/Handler.php35
1
App\Exceptions\Handler report
/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php92
0
Illuminate\Foundation\Bootstrap\HandleExceptions handleException
[internal]0
/var/www/fscoceans/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
     * {@inheritdoc}
     */
    protected function write(array $record): void
    {
        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([$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 in append mode: '.$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
     */
Arguments
  1. "The stream or file "/var/www/fscoceans/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied"
    
/var/www/fscoceans/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
{
    use ProcessableHandlerTrait;
    use FormattableHandlerTrait;
 
    /**
     * {@inheritdoc}
     */
    public function handle(array $record): bool
    {
        if (!$this->isHandling($record)) {
            return false;
        }
 
        if ($this->processors) {
            $record = $this->processRecord($record);
        }
 
        $record['formatted'] = $this->getFormatter()->format($record);
 
        $this->write($record);
 
        return false === $this->bubble;
    }
 
    /**
     * Writes the record down to the log of the implementing handler
     */
    abstract protected function write(array $record): void;
 
    public function reset()
    {
        parent::reset();
 
        $this->resetProcessors();
    }
}
 
/var/www/fscoceans/vendor/monolog/monolog/src/Monolog/Logger.php
                    'level_name' => $levelName,
                    'channel' => $this->name,
                    'datetime' => new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
                    'extra' => [],
                ];
 
                try {
                    foreach ($this->processors as $processor) {
                        $record = $processor($record);
                    }
                } catch (Throwable $e) {
                    $this->handleException($e, $record);
 
                    return true;
                }
            }
 
            // once the record exists, send it to all handlers as long as the bubbling chain is not interrupted
            try {
                if (true === $handler->handle($record)) {
                    break;
                }
            } catch (Throwable $e) {
                $this->handleException($e, $record);
 
                return true;
            }
        }
 
        return null !== $record;
    }
 
    /**
     * Ends a log cycle and frees all resources used by handlers.
     *
     * Closing a Handler means flushing all buffers and freeing any open resources/handles.
     * Handlers that have been closed should be able to accept log records again and re-open
     * themselves on demand, but this may not always be possible depending on implementation.
     *
     * This is useful at the end of a request and will be called automatically on every handler
/var/www/fscoceans/vendor/monolog/monolog/src/Monolog/Logger.php
     *
     * @param string  $message The log message
     * @param mixed[] $context The log context
     */
    public function alert($message, array $context = []): void
    {
        $this->addRecord(static::ALERT, (string) $message, $context);
    }
 
    /**
     * Adds a log record at the EMERGENCY level.
     *
     * This method allows for compatibility with common interfaces.
     *
     * @param string  $message The log message
     * @param mixed[] $context The log context
     */
    public function emergency($message, array $context = []): void
    {
        $this->addRecord(static::EMERGENCY, (string) $message, $context);
    }
 
    /**
     * Sets the timezone to be used for the timestamp of log records.
     */
    public function setTimezone(DateTimeZone $tz): self
    {
        $this->timezone = $tz;
 
        return $this;
    }
 
    /**
     * Returns the timezone to be used for the timestamp of log records.
     */
    public function getTimezone(): DateTimeZone
    {
        return $this->timezone;
    }
 
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/Logger.php
     * @return void
     */
    public function write($level, $message, array $context = [])
    {
        $this->writeLog($level, $message, $context);
    }
 
    /**
     * Write a message to the log.
     *
     * @param  string  $level
     * @param  string  $message
     * @param  array  $context
     * @return void
     */
    protected function writeLog($level, $message, $context)
    {
        $this->fireLogEvent($level, $message = $this->formatMessage($message), $context);
 
        $this->logger->{$level}($message, $context);
    }
 
    /**
     * Register a new callback handler for when a log event is triggered.
     *
     * @param  \Closure  $callback
     * @return void
     *
     * @throws \RuntimeException
     */
    public function listen(Closure $callback)
    {
        if (! isset($this->dispatcher)) {
            throw new RuntimeException('Events dispatcher has not been set.');
        }
 
        $this->dispatcher->listen(MessageLogged::class, $callback);
    }
 
    /**
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/Logger.php
     * @param  \Psr\Log\LoggerInterface  $logger
     * @param  \Illuminate\Contracts\Events\Dispatcher|null  $dispatcher
     * @return void
     */
    public function __construct(LoggerInterface $logger, Dispatcher $dispatcher = null)
    {
        $this->logger = $logger;
        $this->dispatcher = $dispatcher;
    }
 
    /**
     * Log an emergency message to the logs.
     *
     * @param  string  $message
     * @param  array  $context
     * @return void
     */
    public function emergency($message, array $context = [])
    {
        $this->writeLog(__FUNCTION__, $message, $context);
    }
 
    /**
     * Log an alert message to the logs.
     *
     * @param  string  $message
     * @param  array  $context
     * @return void
     */
    public function alert($message, array $context = [])
    {
        $this->writeLog(__FUNCTION__, $message, $context);
    }
 
    /**
     * Log a critical message to the logs.
     *
     * @param  string  $message
     * @param  array  $context
     * @return void
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/LogManager.php
    {
        return $this->channels;
    }
 
    /**
     * Attempt to get the log from the local cache.
     *
     * @param  string  $name
     * @return \Psr\Log\LoggerInterface
     */
    protected function get($name)
    {
        try {
            return $this->channels[$name] ?? with($this->resolve($name), function ($logger) use ($name) {
                return $this->channels[$name] = $this->tap($name, new Logger($logger, $this->app['events']));
            });
        } catch (Throwable $e) {
            return tap($this->createEmergencyLogger(), function ($logger) use ($e) {
                $logger->emergency('Unable to create configured logger. Using emergency logger.', [
                    'exception' => $e,
                ]);
            });
        }
    }
 
    /**
     * Apply the configured taps for the logger.
     *
     * @param  string  $name
     * @param  \Illuminate\Log\Logger  $logger
     * @return \Illuminate\Log\Logger
     */
    protected function tap($name, Logger $logger)
    {
        foreach ($this->configurationFor($name)['tap'] ?? [] as $tap) {
            [$class, $arguments] = $this->parseTap($tap);
 
            $this->app->make($class)->__invoke($logger, ...explode(',', $arguments));
        }
 
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Support/helpers.php
            goto beginning;
        }
    }
}
 
if (! function_exists('tap')) {
    /**
     * Call the given Closure with the given value then return the value.
     *
     * @param  mixed  $value
     * @param  callable|null  $callback
     * @return mixed
     */
    function tap($value, $callback = null)
    {
        if (is_null($callback)) {
            return new HigherOrderTapProxy($value);
        }
 
        $callback($value);
 
        return $value;
    }
}
 
if (! function_exists('throw_if')) {
    /**
     * Throw the given exception if the given condition is true.
     *
     * @param  mixed  $condition
     * @param  \Throwable|string  $exception
     * @param  array  ...$parameters
     * @return mixed
     *
     * @throws \Throwable
     */
    function throw_if($condition, $exception, ...$parameters)
    {
        if ($condition) {
            throw (is_string($exception) ? new $exception(...$parameters) : $exception);
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/LogManager.php
    }
 
    /**
     * Attempt to get the log from the local cache.
     *
     * @param  string  $name
     * @return \Psr\Log\LoggerInterface
     */
    protected function get($name)
    {
        try {
            return $this->channels[$name] ?? with($this->resolve($name), function ($logger) use ($name) {
                return $this->channels[$name] = $this->tap($name, new Logger($logger, $this->app['events']));
            });
        } catch (Throwable $e) {
            return tap($this->createEmergencyLogger(), function ($logger) use ($e) {
                $logger->emergency('Unable to create configured logger. Using emergency logger.', [
                    'exception' => $e,
                ]);
            });
        }
    }
 
    /**
     * Apply the configured taps for the logger.
     *
     * @param  string  $name
     * @param  \Illuminate\Log\Logger  $logger
     * @return \Illuminate\Log\Logger
     */
    protected function tap($name, Logger $logger)
    {
        foreach ($this->configurationFor($name)['tap'] ?? [] as $tap) {
            [$class, $arguments] = $this->parseTap($tap);
 
            $this->app->make($class)->__invoke($logger, ...explode(',', $arguments));
        }
 
        return $logger;
    }
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/LogManager.php
    /**
     * Get a log channel instance.
     *
     * @param  string|null  $channel
     * @return \Psr\Log\LoggerInterface
     */
    public function channel($channel = null)
    {
        return $this->driver($channel);
    }
 
    /**
     * Get a log driver instance.
     *
     * @param  string|null  $driver
     * @return \Psr\Log\LoggerInterface
     */
    public function driver($driver = null)
    {
        return $this->get($driver ?? $this->getDefaultDriver());
    }
 
    /**
     * @return array
     */
    public function getChannels()
    {
        return $this->channels;
    }
 
    /**
     * Attempt to get the log from the local cache.
     *
     * @param  string  $name
     * @return \Psr\Log\LoggerInterface
     */
    protected function get($name)
    {
        try {
            return $this->channels[$name] ?? with($this->resolve($name), function ($logger) use ($name) {
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Log/LogManager.php
     *
     * @return void
     */
    public function critical($message, array $context = [])
    {
        $this->driver()->critical($message, $context);
    }
 
    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param  string  $message
     * @param  array  $context
     *
     * @return void
     */
    public function error($message, array $context = [])
    {
        $this->driver()->error($message, $context);
    }
 
    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param  string  $message
     * @param  array  $context
     *
     * @return void
     */
    public function warning($message, array $context = [])
    {
        $this->driver()->warning($message, $context);
    }
 
    /**
     * Normal but significant events.
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
        if ($this->shouldntReport($e)) {
            return;
        }
 
        if (Reflector::isCallable($reportCallable = [$e, 'report'])) {
            return $this->container->call($reportCallable);
        }
 
        try {
            $logger = $this->container->make(LoggerInterface::class);
        } catch (Exception $ex) {
            throw $e;
        }
 
        $logger->error(
            $e->getMessage(),
            array_merge(
                $this->exceptionContext($e),
                $this->context(),
                ['exception' => $e]
            )
        );
    }
 
    /**
     * Determine if the exception should be reported.
     *
     * @param  \Exception  $e
     * @return bool
     */
    public function shouldReport(Exception $e)
    {
        return ! $this->shouldntReport($e);
    }
 
    /**
     * Determine if the exception is in the "do not report" list.
     *
     * @param  \Exception  $e
     * @return bool
/var/www/fscoceans/app/Exceptions/Handler.php
    protected $dontReport = [
        \Illuminate\Auth\AuthenticationException::class,
        \Illuminate\Auth\Access\AuthorizationException::class,
        \Symfony\Component\HttpKernel\Exception\HttpException::class,
        \Illuminate\Database\Eloquent\ModelNotFoundException::class,
        \Illuminate\Session\TokenMismatchException::class,
        \Illuminate\Validation\ValidationException::class,
    ];
 
    /**
     * Report or log an exception.
     *
     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }
 
    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }
 
    /**
     * Convert an authentication exception into an unauthenticated response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
/var/www/fscoceans/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php
    /**
     * Handle an uncaught exception from the application.
     *
     * Note: Most exceptions can be handled via the try / catch block in
     * the HTTP and Console kernels. But, fatal error exceptions must
     * be handled differently since they are not normal exceptions.
     *
     * @param  \Throwable  $e
     * @return void
     */
    public function handleException($e)
    {
        if (! $e instanceof Exception) {
            $e = new FatalThrowableError($e);
        }
 
        try {
            self::$reservedMemory = null;
 
            $this->getExceptionHandler()->report($e);
        } catch (Exception $e) {
            //
        }
 
        if ($this->app->runningInConsole()) {
            $this->renderForConsole($e);
        } else {
            $this->renderHttpResponse($e);
        }
    }
 
    /**
     * Render an exception to the console.
     *
     * @param  \Exception  $e
     * @return void
     */
    protected function renderForConsole(Exception $e)
    {
        $this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);
[internal]

Environment & details:

empty
empty
empty
empty
empty
Key Value
USER
"www-data"
HOME
"/var/www"
HTTP_CF_IPCOUNTRY
"US"
HTTP_CDN_LOOP
"cloudflare"
HTTP_CF_CONNECTING_IP
"54.163.195.125"
HTTP_USER_AGENT
"claudebot"
HTTP_ACCEPT
"*/*"
HTTP_CF_VISITOR
"{"scheme":"https"}"
HTTP_X_FORWARDED_PROTO
"https"
HTTP_CF_RAY
"86beb1e6190b7fae-IAD"
HTTP_X_FORWARDED_FOR
"54.163.195.125"
HTTP_ACCEPT_ENCODING
"gzip, br"
HTTP_CONNECTION
"Keep-Alive"
HTTP_HOST
"www.fscoceans.com"
REDIRECT_STATUS
"200"
SERVER_NAME
"fscoceans.com"
SERVER_PORT
"443"
SERVER_ADDR
"172.31.11.164"
REMOTE_PORT
"43958"
REMOTE_ADDR
"172.70.134.112"
SERVER_SOFTWARE
"nginx/1.18.0"
GATEWAY_INTERFACE
"CGI/1.1"
HTTPS
"on"
REQUEST_SCHEME
"https"
SERVER_PROTOCOL
"HTTP/1.1"
DOCUMENT_ROOT
"/var/www/fscoceans/public"
DOCUMENT_URI
"/index.php"
REQUEST_URI
"/blog/article/ai-truck-platooning"
SCRIPT_NAME
"/index.php"
CONTENT_LENGTH
""
CONTENT_TYPE
""
REQUEST_METHOD
"GET"
QUERY_STRING
""
SCRIPT_FILENAME
"/var/www/fscoceans/public/index.php"
FCGI_ROLE
"RESPONDER"
PHP_SELF
"/index.php"
REQUEST_TIME_FLOAT
1711703092.4026
REQUEST_TIME
1711703092
APP_ENV
"production"
APP_KEY
"base64:mqyR8n99S07abfMvtu1F1UA+7H8B1ZjmAv2BFQPYEgE="
APP_DEBUG
"true"
APP_LOG_LEVEL
"debug"
APP_URL
"https://www.fscoceans.com"
DB_CONNECTION
"mysql"
DB_HOST
"fsc-03.c7v7jffibwta.eu-west-2.rds.amazonaws.com"
DB_PORT
"3306"
DB_DATABASE
"fsc_prod"
DB_USERNAME
"fsc_app"
DB_PASSWORD
"GS&1{[jdp(y["
BROADCAST_DRIVER
"log"
CACHE_DRIVER
"array"
SESSION_DRIVER
"file"
QUEUE_DRIVER
"sync"
REDIS_HOST
"127.0.0.1"
REDIS_PASSWORD
"null"
REDIS_PORT
"6379"
MAIL_DRIVER
"smtp"
MAIL_HOST
"in-v3.mailjet.com"
MAIL_PORT
"587"
MAIL_USERNAME
"afc5c2fdd975fed17e3a2f0ecc709bd4"
MAIL_PASSWORD
"aa522aeb885b983e38b408bae902d857"
MAIL_ENCRYPTION
"tls"
PUSHER_APP_ID
""
PUSHER_KEY
""
PUSHER_SECRET
""
Key Value
APP_ENV
"production"
APP_KEY
"base64:mqyR8n99S07abfMvtu1F1UA+7H8B1ZjmAv2BFQPYEgE="
APP_DEBUG
"true"
APP_LOG_LEVEL
"debug"
APP_URL
"https://www.fscoceans.com"
DB_CONNECTION
"mysql"
DB_HOST
"fsc-03.c7v7jffibwta.eu-west-2.rds.amazonaws.com"
DB_PORT
"3306"
DB_DATABASE
"fsc_prod"
DB_USERNAME
"fsc_app"
DB_PASSWORD
"GS&1{[jdp(y["
BROADCAST_DRIVER
"log"
CACHE_DRIVER
"array"
SESSION_DRIVER
"file"
QUEUE_DRIVER
"sync"
REDIS_HOST
"127.0.0.1"
REDIS_PASSWORD
"null"
REDIS_PORT
"6379"
MAIL_DRIVER
"smtp"
MAIL_HOST
"in-v3.mailjet.com"
MAIL_PORT
"587"
MAIL_USERNAME
"afc5c2fdd975fed17e3a2f0ecc709bd4"
MAIL_PASSWORD
"aa522aeb885b983e38b408bae902d857"
MAIL_ENCRYPTION
"tls"
PUSHER_APP_ID
""
PUSHER_KEY
""
PUSHER_SECRET
""
0. Whoops\Handler\PrettyPageHandler