0

在 YII 中,当你想登录时,你只需调用:

YII::log("bla");

在 Zend 中,我必须创建一个函数:

private function log($message, $priority = Zend_Log::INFO)
{
    $logger = Zend_Registry::get("log");
    if( is_object($message) || is_array($message) )
        $logger->log( print_r( $message,true), $priority);
    else
        $logger->log( $message, $priority);
}

获得全局函数的最简单方法是什么,这样我也可以像使用 YII 一样轻松记录内容。是否有一种内置的方式可以让我做这样的事情:

 ZEND::log("Bla");

或者我将如何创建这样的功能以及将其放在我的代码中的什么位置?

4

1 回答 1

2

这取决于您记录日志的目的。我看到三个选项:

  1. 标准日志记录。如果您想记录所有内容,以便您可以检查谁做了什么动作,您应该创建一个插件并让它记录,或者使数据库适配器记录。

    我做的一个记录示例:

    class App_Plugin_Logger extends Zend_Controller_Plugin_Abstract {
    
    protected $fileLoc;
    public function __construct($file = null) {
        if($file ===null)
            $file = APPLICATION_PATH.'/../log/log_'.date('Y-m-d').'.txt';
        $this->fileLoc = $file;
    }
    
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        $id = (Zend_Auth::getInstance()->hasIdentity() ? Zend_Auth::getInstance()->getIdentity()->getId() : 0);
    
        $fp = fopen($this->fileLoc,"a");
        $message = date('Y-m-d H:i:s').' '.$request->getServer('REMOTE_ADDR').' USER:'.$id.' '.json_encode($request->getParams()).PHP_EOL;
            //logs all the input data (post/get), controller, action and ip-addres of client
        if(fwrite($fp,$message)===false){
            error_log('MagStream, Logging failed:'.$message);
        }
        fclose($fp);
    }
    }
    
  2. 如果您只想知道一个用于调试的变量,您可以die(var_dump($variable));或者使用 xdebug 扩展(非常有用)

  3. 如果您想在特定位置登录,您可以创建自己的类,打开文件并在末尾添加一行或使用 zend_log 库:http ://framework.zend.com/manual/1.12/en/zend .log.overview.html

你可以给 Zend_Log 添加一个静态函数:

public static function l($mes){
  $logger = new Zend_Log();
  $writer = new Zend_Log_Writer_Stream('php://output'); 
  $logger->addWriter($writer);
  $logger->log($mes, Zend_Log::DEBUG);
}
于 2013-08-19T08:38:09.070 回答