代码之家  ›  专栏  ›  技术社区  ›  Kevin

自定义监视程序日志记录

  •  0
  • Kevin  · 技术社区  · 14 年前

    下面是我要修复的商业商店场景:

    网站管理员登录,为用户创建订单,为用户创建付款和/或对订单应用信用。

    Watchdog记录所有这些,但作为管理员用户,当我们需要它作为客户用户时,会对其采取操作(因此我们可以在该人员帐户上列出系统对其帐户或订单所做的所有操作)。

    function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) {
      global $user, $base_root;
    
      // Prepare the fields to be logged
      $log_message = array(
        'type' => $type, 
        'message' => $message, 
        'variables' => $variables, 
        'severity' => $severity, 
        'link' => $link, 
        'user' => $user, 
        'request_uri' => $base_root . request_uri(), 
        'referer' => referer_uri(), 
        'ip' => ip_address(), 
        'timestamp' => time(),
      );
    
      // Call the logging hooks to log/process the message
      foreach (module_implements('watchdog') as $module) {
        module_invoke($module, 'watchdog', $log_message);
      }
    } 
    

    有没有一种方法可以覆盖global$user而不攻击核心功能,也不复制它?

    我能以某种方式将$user作为变量传递吗?我可以在watchdog()之前调用$user=user_load($customer->uid)来诱使它记录该用户吗?如果可以的话,我希望记录的UID不是0或1,因为很难跟踪每个用户配置文件(帐户、帐单、订单等)的某些方面的日志。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Igor Rodinov    14 年前

    请尝试以下代码:

        global $user;
        $original_user = $user;
        session_save_session(FALSE);
        $user = user_load(array("uid" => NEW_USER_UID));      
        watchdog(HERE);
        $user = $original_user;   // @TODO: switch user: user back    
        session_save_session(TRUE);
    

    我不喜欢这个,但它是有效的:)

        2
  •  3
  •   ceejayoz    14 年前

    你最好把这个记录在一个单独的表中。监视程序用于临时系统消息,而不是面向用户的永久信息。如果没有别的,它会定期在cron上清理,这可能会让用户抓狂。

    如果你这样做的话,看门狗函数有一个钩子, hook_watchdog