我愿意将当前经过身份验证的用户ID作为自定义日志格式添加到日志行(我正在使用syslog驱动程序)。
作为研究的一部分,我发现有不错的软件包和tutorials可以将用户活动记录到数据库中。但是至少到目前为止,我的意图是继续前进,而不需要额外的程序包,并像我目前所做的那样登录到 syslog 。
我的应用程序中的典型日志调用如下:
logger()->info("Listing all items");
我还可以做类似的事情:
$uid = Auth::id();
logger()->info("Listing all items for {$uid}");
这与文档示例所建议的类似:
我目前正在某些行中执行此操作,但是由于我希望在所有日志调用中都进行此操作,因此就像我每次记录某些内容时重复自己一样。
当前:
Dec 10 23:54:05 trinsic Laravel[13606]: local.INFO: Hello world []
所需:
Dec 10 23:54:05 trinsic Laravel[13606]: local.INFO [AUTH_USER_ID=2452]: Hello world []
我尝试成功地点击记录器,成功更改了as suggested on docs格式。
但是我当前的问题是在执行CustomizeFormatter
类的那一点上,Auth ID似乎还没有解决(对此不确定(但是不确定,但是dd()
返回null,所以这是我的猜):
<?php
namespace App\Logging;
use Illuminate\Support\Facades\Auth;
use Monolog\Formatter\LineFormatter;
class CustomizeFormatter
{
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
$authUser = Auth::id(); // null
foreach ($logger->getHandlers() as $handler) {
$formatter = new LineFormatter("%channel%.%level_name% [AUTH={$authUser}]: %message% %extra%");
$handler->setFormatter($formatter);
}
}
}
Laravel 5.7
日志驱动程序:syslog
// config/logging.php
'syslog' => [
'driver' => 'syslog',
'tap' => [ App\Logging\CustomizeFormatter::class ],
'level' => 'debug',
],
答案 0 :(得分:1)
尝试将请求对象作为构造函数arg传递到您的自定义格式化程序类,然后从那里访问用户:
<?php
namespace App\Logging;
use Illuminate\Support\Facades\Auth;
use Monolog\Formatter\LineFormatter;
class CustomizeFormatter
{
public $request;
public function __construct(Request $request)
{
$this->request = $request;
}
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
$authUser = $this->request->user();
foreach ($logger->getHandlers() as $handler) {
$formatter = new LineFormatter("%channel%.%level_name% [AUTH={$authUser->id}]: %message% %extra%");
$handler->setFormatter($formatter);
}
}
}
答案 1 :(得分:0)
基于 DigitalDrifter 的答案和this post from Emir Karşıyakalı的一部分,我设法获得了足够公平的解决方案。
我无法抓住用户ID,因为(据我目前的理解)尚无法解决。但是我对获得或多或少准确的客户端ID和会话ID感到满意,因此我可以在日志上跟踪用户交互线程:
<?php
namespace App\Loggers;
use Monolog\Formatter\LineFormatter;
class LocalLogger
{
private $request;
public function __construct(\Illuminate\Http\Request $request)
{
$this->request = $request;
}
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter($this->getLogFormatter());
}
}
protected function getLogFormatter()
{
$uniqueClientId = $this->getUniqueClientId();
$format = str_replace(
'[%datetime%] ',
sprintf('[%%datetime%%] %s ', $uniqueClientId),
LineFormatter::SIMPLE_FORMAT
);
return new LineFormatter($format, null, true, true);
}
protected function getUniqueClientId()
{
$clientId = md5($this->request->server('HTTP_USER_AGENT').'/'.$this->request->ip());
$sessionId = \Session::getId();
return "[{$clientId}:{$sessionId}]";
}
}
配置:
// config/logger.php
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
'tap' => [App\Loggers\LocalLogger::class],
],
现在我可以得到类似的东西了
Dec 11 13:54:13 trinsic Fimedi[13390]: [2018-12-11 16:54:13] c6c6cb03fafd4b31493478e76b490650 local.INFO: Hello world
或
Dec 11 13:55:44 trinsic Fimedi[13390]: [2018-12-11 16:55:44] [c6c6cb03fafd4b31493478e76b490650:xUs2WxIb3TvKcpCpFNPFyvBChE88Nk0YbwZI3KrY] local.INFO: Hello world
取决于我如何计算用户/会话ID。