You could do this by implementing custom ErrorHandler and overriding some of AppKernel methods. For example:
class AppKernel
{
protected $prodErrorHandler;
public function init()
{
if ($this->debug) {
ini_set('display_errors', 1);
error_reporting(-1);
DebugUniversalClassLoader::enable();
ErrorHandler::register();
if ('cli' !== php_sapi_name()) {
ExceptionHandler::register();
}
} else {
ini_set('display_errors', 0);
error_reporting(-1);
$this->prodErrorHandler = new CustomErrorHandler();
set_error_handler(array($this->prodErrorHandler, 'handle'));
}
}
public function boot()
{
$booted = $this->booted;
parent::boot();
if (!$booted && $this->prodErrorHandler !== null && $this->container->has('logger')) {
$this->prodErrorHandler->setLogger($this->container->get('logger'));
}
}
// ... other methods
}
class CustomErrorHandler
{
protected $logger;
protected $buffer = array();
public function setLogger($logger)
{
$this->logger = $logger;
foreach ($this->buffer as $error) {
$this->logger->warning($error);
}
$this->buffer = array();
}
public function handle($level, $message, $file, $line, $context)
{
if (error_reporting() & $level) {
$error = new \ErrorException(sprintf('%s: %s in %s line %d', isset($this->levels[$level]) ? $this->levels[$level] : $level, $message, $file, $line));
if ($this->logger !== null) {
$this->logger->warning($error);
} else {
$this->buffer[] = $error;
}
return true; // this would skip logging to file etc. Return false to just log and pass error handling to other handlers
} else {
return false;
}
}
}
Something similar can be done with separate Bundle too, but it can "skip" some of errors occurred before bundle is registered.
If you use Monolog 1.6 or later, you can also use Monolog\ErrorHandler to register logger for errors, unhandled exceptions and fatal errors.
files app/logs/prod.log?