gpt4 book ai didi

php - 在 Symfony 2 中记录警告和通知

转载 作者:搜寻专家 更新时间:2023-10-31 21:12:59 30 4
gpt4 key购买 nike

在开发环境中,警告由 symfony ErrorHandler 捕获,这很好。在 prod env symfony 忽略警告,我只在 php 错误日志中得到它们。现在我还希望记录这些错误。

降低日志级别没有用,因为根本没有处理这些错误。那么如何在 Symfony prod 环境中记录这些错误呢?

我正在使用 Symfony 2.0

编辑:好的,我看到在不处于 Debug模式时甚至没有错误处理程序 (Kernel.php):

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);
}

那么在不违反框架的情况下实现它的最佳方法是什么?

最佳答案

您可以通过实现自定义 ErrorHandler 并重写一些 AppKernel 方法来做到这一点。例如:

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;
}
}
}

类似的事情也可以用单独的 Bundle 完成,但它可以“跳过”在注册 bundle 之前发生的一些错误。

如果您使用 Monolog 1.6 或更高版本,您还可以使用 Monolog\ErrorHandler为错误、未处理的异常和 fatal error 注册记录器。

关于php - 在 Symfony 2 中记录警告和通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15132379/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com