Armazenar eventos de registro em SQL ou MongoDB

Posted on: November 07, 2020 12:39 PM

Posted by: Renato

Categories: Laravel mongodb mysql

Views: 48

Laravel fornece logs em arquivos para registro. Mas à medida que seu aplicativo cresce, o tamanho do arquivo aumenta. No entanto, você pode armazenar o log do laravel no banco de dados. Para que você possa buscar e depurar a exceção em arquivos.

Embora o login no arquivo às vezes seja um trabalho tedioso. E buscar log dele consome memória se o tamanho do arquivo for grande. Como comparar com isso, buscar dados do banco de dados é fácil.

Armazenar eventos de log de laravel

Laravel 5.0: use database and Eloquent for logging ยท @zhukserega

Há um manipulador de canal Larvel Log personalizado presente. No entanto, ele pode armazenar eventos de log em bancos de dados SQL ou MongoDB. Além disso, usa a funcionalidade de registro nativo do Laravel. Você pode armazenar logs no banco de dados SQL ou No SQL. Ambos são suportados por este pacote.

Mais importante ainda, você precisa primeiro instalar o pacote MongoDB. Este pacote é necessário para o driver mongoDB. Em primeiro lugar, verifique se você instalou o driver mongoDB em seu sistema. Você pode encontrar mais informações em phpinfo ().


Instale o pacote MongoDB


A instalação requer a biblioteca do driver MongoDB usando o comando composer abaixo.


composer require mongodb/mongodb


Além disso, há um pacote para um modelo Eloquent baseado em MongoDB e construtor de consultas. Este pacote é o pacote dev necessário para o pacote de manipulador de log.


composer require jenssegers/mongodb


Instale o log do Laravel no pacote DB
Além disso, instale o pacote de manipulador de canal de log usando o comando abaixo.


composer require danielme85/laravel-log-to-db


Depois de instalar o pacote, se você armazenar os logs em sql, execute a migração.


php artisan migrate


Agora, uma vez feito isso, publique-o.


php artisan vendor:publish


Isso copiará o arquivo logtodb.php para a pasta de configuração. Você pode escrever canais de registro avançados para este pacote. Personalize esses canais e use-os para registro.

'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['database', 'mongodb'],
    ],
    
    'database' => [
        'driver' => 'custom',
        'via' => danielme85\LaravelLogToDB\LogToDbHandler::class,
        'level' => env('APP_LOG_LEVEL', 'debug'),
        'connection' => 'default',
        'collection' => 'log'
        'detailed' => true,
        'queue' => false
        'queue_name' => 'logQueue'
        'queue_connection' => ''
    ],
    
    'mongodb' => [
        'driver' => 'custom',
        'via' => danielme85\LaravelLogToDB\LogToDbHandler::class,
        'level' => 'debug',
        'connection' => 'mongodb',
        'collection' => 'log',
        'detailed' => true,
        'queue' => false
        'queue_name' => 'logQueue'
        'queue_connection' => ''
    ]
]


Cenário em .env
Além disso, defina a configuração do log no arquivo .env no projeto Laravel.

LOG_DB_CONNECTION='default'
LOG_DB_DETAILED=false
LOG_DB_MAX=100
LOG_DB_QUEUE=false
LOG_DB_QUEUE_NAME='logToDBQueue'
LOG_DB_QUEUE_CONNECTION='default'


Além disso, você pode armazenar esse evento usando filas. Portanto, defina a configuração da fila e execute o listener da fila. Basta definir o valor LOG_DB_QUEUE como verdadeiro. No entanto, isso habilitará a fila e armazenará os logs usando-a.

Uso
Portanto, com base no seu evento de log, existem poucos eventos de Log Facade

  • depurar
  • informação
  • aviso prévio
  • Atenção
  • erro
  • crítico
  • alerta
  • emergência

Além disso, este pode usar com Log fachada para registro.

Log de armazenamento em SQL
Uma vez que você armazena o log no MySQL. Em seguida, basta criar um modelo com migração. O modelo é opcional para este pacote.


php artisan make:model Log -m


Então, sua migração e modelo são criados. Além disso, defina o esquema para a tabela de log na migração.

 

public function up()
{
    Schema::create('log', function (Blueprint $table) {
        $table->increments('id');
        $table->text('message')->nullable();
        $table->string('channel')->nullable();
        $table->integer('level')->default(0);
        $table->string('level_name', 20);
        $table->integer('unix_time');
        $table->text('datetime')->nullable();
        $table->longText('context')->nullable();
        $table->text('extra')->nullable();
        $table->timestamps();
    });
}


Agora, migre esta migração usando o comando artisan.


php artisan migrate


Além disso, você precisa especificar uma conexão para o modelo. Portanto, o modelo de log será semelhante a seguir. Isso é opcional, pois usaremos a fachada monológica.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Log extends Model
{
    protected $table = 'log';
    protected $connection = 'mysql';
    
}


Em primeiro lugar, conforme sua necessidade de usar o evento para o log. Por exemplo, você precisa registrar erros críticos e usar,


\Log::critical("This is an test CRITICAL log event");


Em segundo lugar, ele armazenará o log no DB com todas as informações. No uso acima, você pode especificar o canal. Portanto, o log será armazenado nesse canal. Da mesma forma, você pode escrever o evento de log especificado acima no controlador.


\Log::channel('database')->info("Information log logged");


Depois de chamar este controlador, verifique seu banco de dados no phpmyadmin. Você obterá o log armazenado no MySql.

Log de armazenamento no MongoDB

DevOps tips and tricks: MongoDB Audit Log Setup
MongoDB é um banco de dados NoSQL. Portanto, não há necessidade de especificar nenhum esquema para coleta. No entanto, ele armazenará os dados em um par de valores-chave. Mas se você quiser usar o modelo, crie usando o comando abaixo. Não crie nenhuma migração para ele.


php artisan make:model LogMongo


Agora, você especifica a conexão e o nome da coleção em seu modelo.

namespace App;

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class LogMongo extends Eloquent
{
    protected $collection = 'log';
    protected $connection = 'mongodb';

}


Da mesma forma, sql você pode usar a fachada de log para armazenar os logs. Mas você precisa fornecer um canal apropriado para isso.


\Log::channel('mongodb')->info("Information log logged");


No entanto, um dos usos importantes do registro é obter a exceção. Portanto, você precisa armazenar a mensagem, o código, a linha, etc. da exceção. Portanto, onde quer que você use este log para uma exceção, use a função abaixo.

public function getExceptionMessages($exception){
      return [
        'message'=>$exception->getMessage(),
        'line'   =>$exception->getLine(),
        'code'   =>$exception->getCode(),
        'file'   =>$exception->getFile()
      ];
    }


Ao armazenar esta exceção no log json_encode- lo. E armazene no banco de dados. Por outro lado, o MongoDB armazenará a string de formato JSON.


$custom_exception = json_encode($this->getExceptionMessages($exception));
\Log::channel('mongodb')->error($custom_exception);


Recuperando os dados
Além disso, obter dados do banco de dados também é fácil. Portanto, este pacote fornece o modelo embutido para buscar os dados.


$model = LogToDB::model(); // Model to fetch data
$model->get();  // Get the data


Uma vez que você cria um modelo, use-o para recuperar os dados do banco de dados. Mas você não pode apenas usar uma consulta no modelo, mas também obter dados de canal específicos a partir dele.


$logsFromChannel = LogDB::model('customnamehere')->get(); //Get logs from the 'customnamehere' log channel.


Da mesma forma, você pode passar o nome da conexão e recuperar os dados dela.

$logsFromChannel = LogToDB::model(null,'mongodb')->get(); //Get logs from the

'customnamehere' log channel.


Além disso, você pode aplicar a cláusula where eloquente sobre ele.


$logs = LogToDB::model()->where('level_name', '=', 'INFO')->get();


Portanto, desta forma você pode armazenar o log no banco de dados. No entanto, ele armazenará muitas outras informações sobre o log. como nível, nível_nome, mensagem, informações extras, etc. Mas se você remover o canal único ou diário, o log não será mais registrado no arquivo de log laravel. Portanto, os logs são armazenados diretamente no banco de dados. Além disso, você pode fazer login em vários bancos de dados em várias conexões usando este pacote.

Fonte: 

Sushant Jadhav-> http://constituteweb.com/store-laravel-log-events-to-sql-or-mongodb

Share
About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment