将 PHP 日志写入我的应用程序日志文件中



我正在开发一个php应用程序,我已经为它创建了日志记录功能。我的意思是每次出现问题时,我都会将其写入日志文件中,因此如果用户报告错误,我可以使用我的日志文件来跟踪该错误。

问题是,如果我在生产服务器上上传我的项目,我必须禁用 PHP 的默认错误显示;我只想在我自己的日志文件中记录php错误以及网络服务器的"错误.log"。有什么办法让我这样做吗?

您可以使用自定义错误处理程序在 php 中执行自己的日志记录。这也允许您登录到数据库(假设错误与数据库无关并且您具有有效的连接)或基于错误的平面文件,还可以设置自定义错误页面。看:

http://www.php.net/manual/en/function.set-error-handler.php

对于特色可用异常(我称之为全功能可用异常,(没有堆栈跟踪)):

如果您是开发人员,请设置为:

   define('EXCEPTION_HANDLER_ACTIVE', true);

在生产中,这也应该是 true,但修改了代码以不向最终用户显示错误。(使用:error_reporting(0); ini_set('display_errors', false)在页面顶部));

首先设置处理异常的主函数:

set_error_handler("_handler_exception");

调用异常处理程序的函数:

function _handler_exception($err_severity, $err_msg, $err_filepath, $err_line)
    {
        if (EXCEPTION_HANDLER_ACTIVE == 1)
        {
            $eh = new exceptionhandler;
            $eh->exception_active = true;
            $eh->set_exception_handler_log($err_severity, $err_msg, $err_filepath, $err_line);
        }
        else
        {
            $eh = new exceptionhandler;
            $eh->exception_active = false;
            $eh->set_exception_handler_log($err_severity, $err_msg, $err_filepath, $err_line);
        }
    }

类异常处理程序:

class exceptionhandler
{
    public $exception_active = true;
   public function set_exception_handler_log($err_severity, $err_msg, $err_filepath, $err_line)
    {        
    $ret_err_severity = NULL;
    $ret_err_no = NULL;
    $ret_info = NULL;
    $filenameerr = NULL;
    $dbout = NULL;
    switch ($err_severity)
    {
        case E_ERROR:
            $ret_err_severity = "E_ERROR"." [ ".$err_severity." ]";
            $ret_err_no = "1";
            $ret_info = "Fatal run-time errors. These indicate errors that can not be recovered from, such as a memory allocation problem. Execution of the script is halted.";
            $ret_err_msg = $err_msg;
            break;
        case E_STRICT:
            $ret_err_severity = "E_STRICT"." [ ".$err_severity." ]";
            $ret_err_no = "2048";
            $ret_info = "Enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code. ";
            $ret_err_msg = $err_msg;
            break;
        default:
            $ret_err_severity = "CODE"." [ ".$err_severity." ]";
            $ret_err_no = $err_severity;
            $ret_info = "Other error";
            $ret_err_msg = $err_msg;
            break;
    }
    $ef = explode("/", $err_filepath);
    $ec = (count($ef) - 1);
    $filenameerr = $ef[$ec];
    $backtrace = debug_backtrace();
    if (!isset($doc_root)) {
        $doc_root = str_replace('\', '/', $_SERVER['DOCUMENT_ROOT']);
    }
    $debug_backtrace_parse = print_r(debug_backtrace(), true);
    $debug_backtrace2 = str_replace($err_msg, '<b>'.$err_msg.'</b>', $debug_backtrace_parse);
    $debug_backtrace = str_replace($err_filepath, '<b>'.$err_filepath.'</b>', $debug_backtrace2);
    $line = (isset($backtrace[1]['line'])) ? htmlspecialchars($backtrace[1]['line']) : '';
    $file = (isset($backtrace[1]['file'])) ? htmlspecialchars(str_replace(array('\', $doc_root), array('/', ''), $backtrace[1]['file'])) : '';
    $class = !empty($backtrace[2]['class']) ? htmlspecialchars($backtrace[2]['class']) . '::' : '';
    $function = !empty($backtrace[2]['function']) ? htmlspecialchars($backtrace[2]['function']) . '() ' : '';
    $dbout = "<pre>$class$function =&gt;$file #$line</b><pre>";
    $memory = memory_get_usage()/1024/1024;
    if ($this->exception_active == true)
    {
        $source_highlight = $this->source_highlight($file, $backtrace);
        ob_start();
        include_once(exception.tpl);
        $buffer = ob_get_contents();
        ob_end_clean();
        echo $buffer;
        exit(-1);
    }
    }

Exception.tpl

<html>
    <head>
    <title><?php echo $ret_err_severity; ?> | <?php echo $filenameerr; ?></title>
    <style type="text/css">
        div#errorhandlerexception
        {
            border: 1px solid #ff0000;
            background-color: #ff9999;
            width: 96%;
            padding: 10px;
            color: #000;
            font-family: sans-serif;
            font-size: 10px;
            margin: 0 auto;
        }
        div#errorhandlerexception h2
        {
            border-bottom: 1px solid #fff;
            color: #ffffff;
        }
        div#errorhandlerexception td
        {
            background-color: #ffcccc;
            width: 100%;
            padding: 3px;
        }
        div#errorhandlerexception .main
        {
            width: 100px;
            height: 30px;
        }
        div#errorhandlerexception
        {
            margin-bottom: 40px;
        }
        .linenum
        {
            text-align:right;
            background:#FDECE1;
            border:1px solid #cc6666;
            padding:0px 1px 0px 9px;
            float:left;
            width:25px;
            margin:3px 0px 30px 0px;
            font-family: Courier New, Courier;
            font-size: 11px;
        }
        .code
        {
            font-family:Courier New, Courier;
            font-size: 11px;
            float: left;
            width: 100%;
        }
        .linetext
        {
            width:95%;
            text-align:left;
            background: #fff;
            border: 1px solid #cc6666;
            border-left:0px;
            padding:0px 1px 0px 8px;
            font-family: Courier New, Courier;
            float:left;
            margin:3px 0px 30px 0px;
            font-size: 11px;
        }
        br.clear
        {
            font-family:Courier New, Courier;
            clear:both;
            font-size: 11px;
        }
        #exception_selected_block
        {
            background-color: #ffff00;
        }
        div.exception_filename
        {
            border-left: 19px solid #AA7777;
            border-top: 3px solid #AA7777;
            color: #000000;
            float: left;
            font-weight: bold;
            padding: 6px;
            width: 98%;
        }
    </style>
    </head>
<body>
<div id="errorhandlerexception"><?php #echo $msg; ?>
<h2>EXCEPTION ERROR HANDLER</h2>
<table>
    <tr><td class="main">Status:</td><td><?php echo $ret_err_severity; echo " #".$err_severity; ?></td></tr>
    <tr><td class="main">Debug stack:</td><td><?php echo $dbout; ?></td></tr>
    <tr><td class="main">Code:</td><td><?php echo $ret_err_no; ?></td></tr>
    <tr><td class="main">Message:</td><td><?php echo $ret_err_msg; ?></td></tr>
    <tr><td class="main">Info:</td><td><?php echo $ret_info; ?></td></tr>
    <tr><td class="main">File:</td><td><?php echo $filenameerr; ?><br><?php echo $err_filepath; ?></td></tr>
    <tr><td class="main">Line:</td><td><?php echo $err_line; ?></td></tr>
    <tr><td class="main" colspan="2"><?php echo $source_highlight; ?></td></tr>
    <tr><td class="main">Debug backtrace:</td><td><pre><?php echo $debug_backtrace; ?></pre></td></tr>
</table>
</div>
</body>
</html>
您可以使用

set_error_handler来定义自己的函数,该函数在出错时被调用。

<?php
//error handler function
function customError($errno, $errstr, $errfile, $errline)
  {
  echo "<b>Custom error:</b> [$errno] $errstr<br />";
  echo " Error on line $errline in $errfile<br />";
  echo "Ending Script";
  die();
//set error handler
set_error_handler("customError");
$test=2;
//trigger error
if ($test>1)
  {
  trigger_error("A custom error has been triggered");
  }
?> 

参考: http://www.w3schools.com/php/func_error_set_error_handler.asp

最新更新