首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义watchdog日志记录

自定义watchdog日志记录
EN

Stack Overflow用户
提问于 2010-11-02 22:54:16
回答 2查看 850关注 0票数 0

以下是我想为一家商业商店修复的场景:

站点管理员登录,为用户创建订单,为用户创建付款和/或在订单上应用积分。

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

我看到看门狗有:

代码语言:javascript
复制
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);
  }
} 

有没有一种方法可以覆盖全局$user,而不需要修改核心函数和复制它?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-03 02:56:38

尝试以下代码:

代码语言:javascript
复制
    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);

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

票数 0
EN

Stack Overflow用户

发布于 2010-11-02 22:59:17

您最好将其记录在一个单独的表中。Watchdog用于临时系统消息,而不是面向用户的永久信息。如果没有其他问题,它会在cron上定期清理,这可能会吓到用户。

但是,如果您打算这样做,watchdog函数有一个钩子hook_watchdog,您的模块可以在其中更改用户。您必须对消息文本做一些巧妙的处理-使其序列化信息,然后在钩子中解析和解包-但这当然是可能的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4078861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档