0

我正在使用 Symfony 1.4 中的 REST API

我想记录进出我的“api”应用程序的所有内容。在 log/api 文件夹中,我将跟踪各种文件中的 api 调用。对于 myModule/myAction 的调用,我将拥有三个文件:

  • 所有请求的 myModule_myAction_RQ.log
  • 所有响应的 myModule_myAction_RS.log
  • myModule_myAction_error.log 用于所有错误响应

我知道如何手动执行此操作,在每个操作的开头和结尾添加一些代码。这是我的方法:

class myActions extends sfActions
{   
/**
 * log function
 */
private static function customLog($message, $seed, $url, $content, $type)
{
    $file =  sprintf('%s/%s_%s.log', sfConfig::get('sf_log_dir', "no_log_dir")."/api", $message, $type);
    $logger = new sfFileLogger(
                new sfEventDispatcher(), 
                array('file'=> $file)
            );

    $logger->log( sprintf("#%s# (%s) %s ", $seed, $url, $content),
                    0, 
                    "info"
    );
}

/**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {
    try {           
        $json_msg = $request->getContent();
        // LOG !!!
        $seed = rand();
        $current_uri = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        self::customLog("availability", $seed, $current_uri, $json_msg, 'RQ');

                    // Do some API logic to set $response_msg
                    // ...

                    $this->response_msg = $response_msg;

        // LOG !!!
        self::customLog("myModule_index", $seed, $current_uri, $response_msg, 'RS');

    }
    catch(Exception $e)
    {
        // throw $e;
        $this->setTemplate("error");
        $this->error = $e;

        // LOG !!!
        self::customLog("myModule_index", $seed, $current_uri, $e->getCode().":".$e->getMessage(), 'error');
    }

  }

以下是一些记录信息的示例:

 myModule_index_RQ.log:
 Apr 25 11:49:31 symfony [emerg] #958824120# (http://host.local/api_dev.php/users/1/index {"price_km":0.66,"reservation_type":3, "position":{"long":2.139015,"lat":41.37947}} 
 Apr 25 11:56:27 symfony [emerg] #512729287# (http://host.local/api_dev.php/users/1/index {"price_km":0.66,"reservation_type":3,"position":{"long":2.161576,"lat":41.396896}}

myModule_index_RS.log:
Apr 25 11:49:32 symfony [emerg] #958824120# (http://host.local/api_dev.php/users/1/index) {"id_availability":539,"alternatives":[{"id_alternative":1,"duration":9,"reservation_type":3,"distance":3.5,"price":1.62,"original_price":2.31}]} 
Apr 25 11:56:27 symfony [emerg] #512729287# (http://host.local/api_dev.php/users/1/index) {"id_availability":540} 

myModule_index_error.log:
 Apr 25 11:38:20 symfony [emerg] #1059359810# (http://host.local/api_dev.php/users/1/index) 4205:Position to out of service area 

现在这可能很快就会变得乏味......

我知道,通过对 Symfony 内部结构的深入了解,我可以很好地实现这一点(DRYly)。所以我的问题来了:

  • 事件可能是完成它的方法。我对吗 ?如果是这样,我应该使用哪些事件?我怎么把它放在一起?
  • 使用 $request->getContent(),我可以获取发送给我的消息的内容。如何获取我的回复内容?(因为我的观点的内容只有在我的行动结束后才知道,这不是可以“像往常一样”做的事情)。
  • 那么,过滤器可能是实现所有这些日志记录功能的方法吗?
  • 也许这个问题太标准了,我可以在一些配置文件中设置它?傻吗?或者某些模块可能正在这样做?

这个级别的 Symfony 内部结构对我来说还是很新的,所以任何提示,一段代码......都会非常受欢迎!

4

1 回答 1

1

好吧,似乎过滤器是这样做的方法......首先,我在应用程序的 lib 文件夹中建立了一个过滤器类:

<?php
class LogFilter extends sfFilter{

 public function execute($filterChain){

      $request = $this->context->getRequest();
      $response = $this->context->getResponse();

      $seed = rand();
      $this->customLog($seed, $request->getContent(), 'RQ');

      $filterChain->execute($filterChain);    

      $this->customLog($seed, $response->getContent(), 'RS');
  }


/**
 * just log
 *  @param integer $seed: a random number that will be identical across request and response.
 *  @param string $content: the content of the message to be logged
 *  @param type: the type of the message (RQ = request, RS = response)
 */
private function customLog($seed, $content, $type)
{
    // get the current action information
    $moduleName = $this->context->getModuleName();
    $actionName = $this->context->getActionName();
    $message = $moduleName."-".$actionName;
    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

    $file =  sprintf('%s/%s-%s.log', sfConfig::get('sf_log_dir', "no_log_dir")."/api-in", $message, $type);
    $logger = new sfFileLogger(
                new sfEventDispatcher(), 
                array('file'=> $file)
            );

    $logger->log( sprintf("#%s# (%s) %s ", $seed, $url, $content),
                    0, 
                    "info"
    );
}

}

在安全和缓存之间的 filters.yml 配置文件(在您的应用程序配置文件夹中)注册您的过滤器:

rendering: ~
security:  ~

# insert your own filters here
MyCustomFilter:  
  class: LogFilter

cache:     ~
execution: ~

而且……就是这样!

于 2013-04-25T14:24:37.913 回答