Como adicionar dados a todos os registros de log no Laravel?
Pergunta
Eu gostaria de adicionar alguns dados para todos os registros de log dentro do meu Laravel aplicação.
Eu acho que seria útil saber o nome de usuário do usuário atual e/ou o endereço IP do cliente.
Atualmente estou adicioná-lo manualmente:
Log::info('Pre-paid activation.', array('username' => Auth::user()->username));
Mas eu gostaria de saber como adicionar um ouvinte ou algo para fazer todos registo recorde de ter o nome de usuário (se disponível).
Solução
Desde Laravel sai da caixa com Monolog, é muito para a frente.Ele pode ser facilmente alcançado por edição app/start/global.php
e adicione o seguinte após a linha que começa com: Log::useFiles
:
Log::useFiles(storage_path().'/logs/laravel.log');
$monolog = Log::getMonolog();
$monolog->pushProcessor(function ($record) {
$record['extra']['user'] = Auth::user() ? Auth::user()->username : 'anonymous';
$record['extra']['ip'] = Request::getClientIp();
return $record;
});
Basicamente, estamos usando a base Monolog instância para registrar um processador que irá interceptar qualquer registro de log para ser escrito.Os resultados serão semelhantes como a seguir:
[2014-04-12 23:07:35] local.INFO:Pré-pago de ativação.[] {"utilizador","anônimo","ip":"::1"}
Mais informações sobre Monolog processadores: https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#using-processors
Extra: O hardcoded extra
é dizer Monolog para adicionar dados como informação extra (redundante dizer).Na prática, isso é para evitar substituindo quaisquer dados de contexto adicionado no original log de chamadas.
Outras dicas
No Laravel 5 você pode fazê-lo através da adaptação de Monolog.Primeiro, crie uma classe que caracteriza Monolog ele adiciona as informações de utilizador para o registo de registos:
namespace App\Logging;
use App\Models\User;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Log\Logger;
class AddUserInformation
{
protected $request;
public function __construct(Request $request = null)
{
$this->request = $request;
}
public function __invoke(Logger $logger)
{
if ($this->request) {
foreach ($logger->getHandlers() as $handler) {
$handler->pushProcessor([$this, 'processLogRecord']);
}
}
}
public function processLogRecord(array $record): array
{
$record['extra'] += [
'user' => $this->request->user()->username ?? 'guest',
'ip' => $this->request->getClientIp()
];
return $record;
}
}
Em seguida, conectar-se a classe para o Laravel logger adicionando-para a configuração do canal no config/logging.php
arquivo:
// ...
'channels' => [
'single' => [
'driver' => 'single',
'tap' => [\App\Logging\AddUserInformation::class],
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
],
// ...
]