KevinZhao 2016-04-09 16:14:42 2525次浏览 1条回复 0 0 0

Hello all, 我是php和Yii的新手,目前在项目中觉得Yii的日志库不太好用,主要是不能像printf那样格式化日志输出,尤其在日志中输出数组或对象时,需要用『"aaaa" . json_encode($arry) . "bbbb"』这样的代码来写,十分麻烦。 因此我想自己封装一个日志库,想要达到的效果是:

$logger = Logger::getLogger();
$logger->trace("Invalid parameters. param:%s", $params);

如下是我实现的一部分代码:

private function expandFormat($args)                                                               
{                                                                                                  
        $numArgs = count($args);                                                                       
        if (0 >= $numArgs) {                                                                           
            return "";                                                                                 
        }                                                                                              
        else if (1 >= $numArgs) {                                                                      
            return $args[0];                                                                           
        }                                                                                              
                                                                                                       
        $format = $args[0];                                                                            
        $printfArgs = "";                                                                              
        for ($i = 1; $i < $numArgs; ++$i) {                                                            
            $arg = $args[$i];                                                                          
            if (is_array($arg) || is_object($arg) || is_callable($arg)) {                              
                $arg = json_encode($arg);                                                              
            }                                                                                          
            elseif (is_resource($arg)) {                                                               
                $arg = "[Resource]";                                                                   
            }                                                                                          
            $printfArgs .= ",";                                                                        
            $printfArgs .= is_string($arg) ? "'$arg'" : $arg;                                          
        }                                                                                              
                                                                                                       
        **$message = eval("\$msg = sprintf('$format'$printfArgs); return \$msg;");**                       
        return $message;                                                                               
    }                                                                                                  
                                                                                                       
    public final function trace($format)                                                               
    {                                                                                                  
        **$message = $this->expandFormat(func_get_args());**
        Yii::trace($message, $this->logTag);                                                           
}

粗体标识的两行代码是我遇到的问题,我想把trace函数的可变参数传递给sprintf,目前在我的知识范围内只知道可以用eval去实现。但是这样有严重的安全问题。 请问我有其它方法可以实现吗? 在线等,谢谢大家!

  • 回复于 2016-04-09 16:16 举报

    我囧,这个粗体标识压根不管用,大家将就看吧。汗!!!

您需要登录后才可以回复。登录 | 立即注册