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).

Foi útil?

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'),
    ],
    // ...
]

Uma documentação sobre como congurar o Monolog

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top