【问题标题】:Is it possible to change PHP error log output?是否可以更改 PHP 错误日志输出?
【发布时间】:2015-08-18 06:37:56
【问题描述】:

我在 php.ini 文件中配置了error_log 指令,如下所示:

error_log = /path/to/logs/error_log

然后我像这样配置error_reporting 指令:

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

当我检查 error_log 文件时,我看到了正常的 PHP 警告/错误文本行:

[03-Jun-2015 08:39:00 America/Bogota] PHP Notice:  Undefined index: cerrar in /fake/path/to/file2.php on line 68
[03-Jun-2015 08:40:49 America/Bogota] PHP Notice:  Undefined index:  in /fake/path/to/file2.php on line 344

有没有办法改变输出格式?我的意思是,如果我可以打印例如导致警告的 IP 地址和子域。

我在 Stack Overflow 和 Google 搜索中寻找它,但没有找到明确的信息或示例。

【问题讨论】:

  • 我认为你必须编写自己的错误日志函数并将其简单地实现到自定义错误处理程序中
  • 您必须在 PHP 源代码中进行更改,然后编译您自己的自定义 php。您只能控制记录哪些消息/警告/错误,而不是它们的文本格式/内容。通常,PHP 不知道调用脚本时使用的 IP/主机名。该信息可以从 $_SERVER 之类的东西中找到,但 PHP 本身不知道网络服务器中的哪些映射导致它被调用。
  • 要与@Rizier123 合作,请查看php.net/manual/en/function.set-error-handler.php
  • 最初,警告被打印在 Apache 日志中,其中出现了我感兴趣的信息,但是 apache 日志文件非常混乱,我没有找到过滤数据的方法。
  • 您可以将错误日志的时间戳与 Apache 访问日志进行协调,以获得您想要的一些信息。

标签: php


【解决方案1】:

所以同意并最终确定上面给出的所有 cmets,最好的方法是set_error_handler。

我为你写了一堂课。我也喜欢set_exception_handler 来获得统一的体验,并将所有错误保存在Error::$throwables 中,以便在关机而不是视图时显示它们(由View 类处理,此处未提供)。

class Error
{
    public static $error_types = array(
        E_ERROR => 'E_ERROR',
        E_WARNING => 'E_WARNING',
        E_PARSE => 'E_PARSE',
        E_NOTICE => 'E_NOTICE',
        E_CORE_ERROR => 'E_CORE_ERROR',
        E_CORE_WARNING => 'E_CORE_WARNING',
        E_COMPILE_ERROR => 'E_COMPILE_ERROR',
        E_COMPILE_WARNING => 'E_COMPILE_WARNING',
        E_USER_ERROR => 'E_USER_ERROR',
        E_USER_WARNING => 'E_USER_WARNING',
        E_USER_NOTICE => 'E_USER_NOTICE',
        E_STRICT => 'E_STRICT',
        E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
        E_DEPRECATED => 'E_DEPRECATED',
        E_USER_DEPRECATED => 'E_USER_DEPRECATED'
    );

    public static $shutdown = FALSE;

    public static $throwables = array();

    public static function set_throwable_handlers()
    {
        ini_set('error_reporting', E_ALL & ~E_DEPRECATED & ~E_STRICT);
        ini_set('display_errors', FALSE);
        ini_set('log_errors', TRUE);
        ini_set('error_log', '/path/to/logs/error_log');

        set_error_handler(array('Error', 'error_handler'));
        set_exception_handler(array('Error', 'exception_handler'));

        register_shutdown_function(array('Error', 'shutdown_handler'));
    }

    public static function set_throwable($error_number, $error_text, $error_file, $error_line, $error_log = TRUE)
    {
        if ($error_log === TRUE)
        {
            //provide any data you want to log to error log
            error_log('PHP ' . self::$error_types[$error_number] . ' : ' . $error_text . ' in ' . $error_file . ' on line ' . $error_line);
        }

        //provide any data you want to class variable
        self::$throwables[$error_number][] = array('type' => self::$error_types[$error_number], 'text' => $error_text, 'file' => $error_file, 'line' => $error_line);
    }

    public static function exception_handler(Exception $exception)
    {
        self::set_throwable($exception->getCode(), $exception->getMessage(), $exception->getFile(), $exception->getLine());
    }

    public static function error_handler($error_number = '', $error_text = '', $error_file = '', $error_line = '')
    {
        self::set_throwable($error_number, $error_text, $error_file, $error_line);
    }

    public static function shutdown_handler()
    {
        $error = error_get_last();

        if ($error !== NULL)
        {
            self::set_throwable($error['type'], $error['message'], $error['file'], $error['line'], FALSE);
        }

        //enables error page on shutdown & displays the throwables
        //self::$shutdown = TRUE;
        //
        //View::display();
    }

    public static function throw_error($error_text, $error_number = E_USER_NOTICE)
    {
        trigger_error($error_text, $error_number);

        exit;
    }
}

【讨论】:

  • 我认为这是最好的方法!非常感谢!
  • set_throwable_handlers() 在哪里调用?
猜你喜欢
  • 1970-01-01
  • 2019-01-20
  • 2018-12-18
  • 1970-01-01
  • 2011-05-06
  • 2012-05-30
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多