【问题标题】:How to log error message in drupal如何在drupal中记录错误消息
【发布时间】:2010-12-14 22:03:12
【问题描述】:

如何将 php 程序中生成的 自己的错误消息(例如:由于用户日期输入无效而导致的错误)记录到 drupal 错误日志。

【问题讨论】:

    标签: php drupal error-logging


    【解决方案1】:

    您可以使用watchdog function

    watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL)
    

    引用手册,参数为:

    • $type此消息所属的类别。
    • $message 要存储在日志中的消息。
    • $variables 要在显示的消息中替换的变量数组,如果消息已翻译或无法翻译,则为 NULL。
    • $severity 消息的严重性,根据 RFC 3164
    • $link 与消息关联的链接。

    并且错误级别可以在watchdog_severity_levels的页面上找到。对于错误,您很可能会使用WATCHDOG_ERROR,或者甚至可能使用更“关键”的东西,具体取决于错误的类型。

    【讨论】:

    • $type 通常是您正在开发的模块的名称。
    【解决方案2】:

    Drupal 8

    // Logs a notice
    \Drupal::logger('my_module')->notice($message);
    // Logs an error
    \Drupal::logger('my_module')->error($message);
    

    How to Log Messages in Drupal 8查看更多示例。

    【讨论】:

    • 我正在尝试记录整个“$form”,但我不能
    • 例如,您可以使用 $message = 'My form: <pre>' . print_r($form, TRUE) . '</pre>; 记录旧学校
    • milkovsky 的评论中缺少'$message = 'My form: <pre>' . print_r($form, TRUE) . '</pre>';
    【解决方案3】:

    1) 事实上,看门狗是记录自己的 PHP 错误的标准方法。

    2) 或者,如果您需要在调试 Drupal 页面时立即看到错误消息,您可能希望在相关页面(在 FireBug 控制台中)看到它们被记录/打印。 当您可以查看与页面相关的即时日志时,有时这非常方便。 这需要 - Devel 模块,Firebug 扩展至 FireFox,可能还有 Firephp

    您可以使用 dfb() 函数将日志消息直接写入通用 Firebug 控制台。

    dfb($input, $label = NULL)
    

    如果您想将与 Drupal 相关的日志消息排除在普通 Firebug 控制台之外,您可以使用 firep() 函数将消息写入 Drupal for Firebug 日志:

    firep($item, $optional_title)
    

    【讨论】:

    • 刚刚安装了 Drupal for Firebug 扩展 - 非常棒。
    【解决方案4】:

    毫无疑问,看门狗是生产系统的必经之路,但在调试过程中,我发现drupal_set_message 函数很有用。

    它将消息输出到通常显示“操作成功”类型消息的屏幕(因此请确保在网站上线之前将其删除)。

    http://api.drupal.org/api/function/drupal_set_message/6

    【讨论】:

      【解决方案5】:

      在 drupal 7 中,我们可以通过以下方法记录消息:

      我们可以使用drupal看门狗功能在数据库中记录消息,确保我们在/admin/build/modules中启用了可选的数据库日志核心模块。

      watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL)
      

      $类型: 该消息所属的类别,例如:PHP,cron..,我们可以按类型过滤消息。

      $消息: 要存储在日志中的消息,例如:'文件系统中缺少以下模块:security_review'

      $变量: 要在显示的消息中替换的变量数组,如果消息已翻译或无法翻译,则为 NULL。 为了使消息翻译,不传递动态值传递变量应该使用占位符字符串添加消息中。

      示例: watchdog('cg_volunteer', 'cg in form_alter %formly', array('%formly' => $form['#id']), WATCHDOG_NOTICE, $link = NULL);

      $严重性 消息的严重性,日志可以根据 RFC 3164 按严重性过滤。可能的值是 WATCHDOG_ERROR、WATCHDOG_WARNING 等。 更多示例见https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/watchdog/7.x

      $链接: 与消息关联的链接。

      示例

      // 用于日志通知

      watchdog('my_module', $message, array());
      

      // 记录错误

      watchdog('my_module', $message, array(), WATCHDOG_ERROR);
      

      在 drupal 8 中我们使用了以下方法:

      // 用于记录一个通知。

      \Drupal::logger('my_module')->notice($message);
      

      // 用于记录错误。

      \Drupal::logger('my_module')->error($message);
      

      // 对于警报,必须立即采取措施。

      \Drupal::logger('my_module')->alert($message);
      

      // 用于重要消息。

      \Drupal::logger('my_module')->critical($message);
      

      // 用于调试级消息。

      \Drupal::logger('my_module')->debug($message);
      

      //紧急情况,系统不可用。

      \Drupal::logger('my_module')->emergency($message);
      

      //警告

      \Drupal::logger('my_module')->warning($message);
      

      //用于信息性消息。

      \Drupal::logger('my_module')->info($message);
      

      对于翻译,我们也不应该使用 t() 函数。

      \Drupal::logger('my_module')->alert('Message from @module: @message.', [
      '@module' => $module,
      '@message' => $message,
      ]);
      

      这将在运行时翻译。

      示例:

      \Drupal::logger('content_entity_example')->notice('@type: deleted %title.',
      array(
      '@type' => $this->entity->bundle(),
      '%title' => $this->entity->label(),
      ));
      

      【讨论】:

      • 如何添加链接?
      【解决方案6】:

      D7 的watchdog 和 D8 的\Drupal::logger 都将在watchdog 表中写入日志(在您的数据库中),并且记录了大量数据,您可以想象性能影响。

      您可以使用error_log php 函数来执行此操作(请参阅PHP manual)。

      error_log("Your message", 3, "/path/to/your/log/file.log");
      

      您需要有写入日志文件的权限 (/path/to/your/log/file.log)

      【讨论】:

        【解决方案7】:
        // Get logger factory.
        $logger = \Drupal::service('logger.factory');
        
        // Log a message with dynamic variables.
        $nodeType = 'Article';
        $userName = 'Admin';
        $logger->get($moduleName)->notice('A new "@nodeType" created by %userName.', [
            '@nodeType' => $nodeType,
            '%userName' => $userName,
        ]);
        

        Source

        【讨论】:

        • 谢谢,我正在寻找如何使用参数来做到这一点。
        猜你喜欢
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多