【问题标题】:Monolog Array log TypeErrorMonolog 数组日志 TypeError
【发布时间】:2018-10-01 10:50:59
【问题描述】:

我在许多 PHP 项目中成功使用 Monolog,并且我经常使用 Monolog\\Logger 的第二个参数来记录数组:

$a = array("lemon", "banana", "apple");
$log->debug("Array: ", $a);

[2018-10-01 10:43:33] /5bb1fa556588f/62309.DEBUG: Array:  ["lemon","banana","apple"] {"file":"/path/to/file.php","line":4,"class":null,"function":"myfunc"}

当 $a 不是一个数组但由于某些原因它是一个布尔值或其他东西时,就会出现问题。在这种情况下,您有更多理由正确记录它,但是当这种情况发生时,Monolog 会抛出 TypeError 异常,并且脚本会在此之后退出:

$a = false;
$log->debug("Array: ", $a);

[2018-10-01 10:45:26] /5bb1fac59dc3e/62693.ERROR: Uncaught Exception TypeError: "Argument 2 passed to Monolog\Logger::debug() must be of the type array, boolean given, called in /path/to/file.php on line 4" at /path/to/project/vendor/monolog/monolog/src/Monolog/Logger.php line 530 {"exception":"[object] (TypeError(code: 0): Argument 2 passed to Monolog\\Logger::debug() must be of the type array, boolean given, called in /path/to/file.php on line 4 at /path/to/project/vendor/monolog/monolog/src/Monolog/Logger.php:530)"} {"file":null,"line":null,"class":null,"function":null}

这是因为 Monolog 不会自动将给定的变量转换为数组。

我不认为这是错误的,但我想了解解决此问题的更好方法是什么:

  • 将第二个参数转换为数组:$log->debug("Array: ", (array)$a);
  • 编写一个自定义函数来包装对 Monolog 的调用并将第二个参数转换为数组
  • 捕获 TypeError 异常并跳过该日志
  • 还有其他想法吗?

【问题讨论】:

  • 更好 - 不要强制转换值,而是用您自己的数组包装它,例如: $log->debug("Array: ", ['context' => $a]);跨度>
  • 感谢 Sergej 的建议。你能解释一下为什么这比将值转换为数组更好吗?
  • 因为,否则在调试时刻你将无法知道变量 $a 的实际值。如果它不是一个数组 - 进行类似的序列化。
  • 你能给我写个例子吗?我知道,如果您将任何内容转换为数组,这将给出一个具有给定变量的单个键的数组,并且变量类型保留在键的值中。
  • $log->debug("Array: ", is_array($a) ? $a : ['not_array_context' => serialize($a)]);

标签: php monolog


【解决方案1】:

Monolog 是一个常见的 PHP 日志库,它实现了PSR-3 LoggerInterface。如果你看一下debug() 方法应该如何表现的定义,你会看到the second argument ($context) must be an array。这就是您收到类型错误的原因。 Monolog 不可能让您将非数组类型传递给此方法,因为它是由接口决定的。

public function debug($message, array $context = array());

我认为到目前为止你建议的选项,最好的是将你的上下文变量转换为一个数组(就像你的例子一样)。

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 2016-04-09
    • 2015-08-30
    • 2017-03-01
    • 2014-08-19
    • 2015-03-24
    • 2018-01-25
    • 2018-07-24
    • 2015-05-06
    相关资源
    最近更新 更多