Drupal Syslog与JSON的奇怪行为

问题描述

我在理解自己遇到的问题时遇到了一些麻烦。我正在使用Drupal syslog在文件上记录一些消息,并且文件上的结果与我var_dump消息时的结果不同。

这里是一个例子:

$logMsg = 'LOGGING TEST : {"test": "test","test1": {"test2": "test2","test3":"test3"}}';

print_r($logMsg);

\Drupal::logger('TestLog')
   ->log(0,$logMsg);

print_r的结果很好:LOGGING TEST : {"test": "test","test3":"test3"}}

但是文件中的结果不正确:LOGGING TEST : @"test": "test","test3":"test3"}

第一个大括号用@代替,最后一个大括号被删除。

经过几个小时的测试,我找不到为什么这样做,有人知道吗?

Drupal的版本是8.9.5和PHP 7.3.22。

谢谢

解决方法

这与 Drupal 记录器解析消息字符串的方式有关。

\Drupal::logger('TestLog') 返回一个 LoggerInterface,记录在 https://api.drupal.org/api/drupal/vendor%21psr%21log%21Psr%21Log%21LoggerInterface.php/interface/LoggerInterface/9.1.x 处。 log() 方法记录在 https://api.drupal.org/api/drupal/vendor%21psr%21log%21Psr%21Log%21LoggerInterface.php/function/LoggerInterface%3A%3Alog/9.1.x 处。但答案实际上在 LoggerInterface 的文档中,而不是在 log() 的文档中:

消息可能包含以下形式的占位符:{foo},其中 foo 将被键“foo”中的上下文数据替换。

因此,不要将您的 JSON 字符串嵌入到 $message 中,而是这样做:

\Drupal::logger('TestLog')->log(
  \Psr\Log\LogLevel::ERROR,"LOGGING TEST : {json_data}",[
    'json_data' => '{"test": "test","test1": {"test2": "test2","test3":"test3"}}',]
);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...