将文件名和行号添加到Monolog输出

12

无法找到一种方法来添加调用日志功能的文件名和行号。 我正在使用一个简单的StreamHandler:

$this->log = new Logger('APP');
$this->log->pushHandler(new StreamHandler('/logs/app.log', Logger::DEBUG));

我希望能够输出类似于这样的结果:

[2017-12-27 12:38:58 filename.php:1234] APP.DEBUG: test 

或包括文件名和行号的任何其他格式。

谢谢,祝好


Monolog/Processor/IntrospectionProcessor 可以将文件/行/类/函数字段添加到您的日志数据中,但是您需要编写自定义格式化程序才能获得您想要的特定输出。 - iainn
谢谢!这就是我要找的。 - asmadeus
1个回答

4
很晚了,但是我想出了如何做,并且我将要发布给其他人。
首先,您需要创建自己的处理器,使用新的记录键进行解析(我将其命名为file_info):
class MyProcessor
{
    /**
     * @param  array $record
     * @return array
     */
    public function __invoke(array $record)
    {
      $info = $this->findFile();
      $record['file_info'] = $info['file'] . ':' . $info['line'];
      return $record;
    }

    public function findFile() {
      $debug = debug_backtrace();
      return [
        'file' => $debug[3] ? basename($debug[3]['file']) : '',
        'line' => $debug[3] ? $debug[3]['line'] : ''
      ];
    }
}

我使用debug_backtrace函数来获取第三个元素:基本文件和行号。不过我不确定它是否每次都能正常工作。

然后,使用自定义的LineFormatter(此部分内容源自这里)创建您的记录器:

use Monolog\Logger;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler;

// the default date format is "Y-m-d\TH:i:sP"
$dateFormat = "Y n j, g:i a";
// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"
$output = "[%datetime% %file_info%] %channel%.%level_name%: %message% %context% %extra%\n";
// finally, create a formatter
$formatter = new LineFormatter($output, $dateFormat);
// Create a handler
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
$stream->setFormatter($formatter);
// bind it to a logger object
$myLogger = new Logger('mylogger');
$myLogger->pushHandler($stream);

现在,您可以使用$myLogger->error('Foo');,结果将为:
[2021 2 24, 6:19 pm ProductController.php:50] mylogger.ERROR: Foo [] []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接