Monolog阵列日志TypeError

时间:2018-10-01 10:51:00

标签: php monolog

我已在许多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异常并跳过该日志
  • 还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

我认为,到目前为止您所建议的选项中,最好的方法是将上下文变量转换为数组(例如您的示例)。