Maison >cadre php >Laravel >À propos des erreurs et des journaux dans Laravel

À propos des erreurs et des journaux dans Laravel

藏色散人
藏色散人original
2021-04-09 13:46:332334parcourir

La colonne tutorielle suivante de laravel vous présentera les erreurs et les journaux dans laravel (vous pouvez personnaliser le répertoire des journaux et le nom du fichier journal, j'espère que cela vous sera utile). aux amis dans le besoin !

À propos des erreurs et des journaux dans Laravel

Journal

La connexion dans Laravel est encapsulée sur la base d'un monologue. Laravel a fait plusieurs choses dessus :

  • Fonctions simplifiées telles que addInfo dans le monologue en fonctions comme info
  • Ajout de deux paramètres : useFiles et useDailyFiles, permettant de faire de la gestion des logs et le découpage est devenu plus facile
  • Si vous souhaitez appeler la méthode monologue, vous devez appeler la fonction callMonolog

D'accord, voyons comment implémenter les exigences suivantes :

Stocker différentes informations de journal dans différents journaux

Cette exigence est très courante. Par exemple, le journal d'appel d'une commande doit être enregistré dans order.log et l'enregistrement d'obtention d'informations sur le magasin doit être enregistré. dans shop.log, allez. Vous pouvez faire ceci :

<?php 
 
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Illuminate\Log\Writer;
 
class BLogger
{
    // 所有的LOG都要求在这里注册
    const LOG_ERROR = &#39;error&#39;;
 
    private static $loggers = array();
 
    // 获取一个实例
    public static function getLogger($type = self::LOG_ERROR, $day = 30)
    {
        if (empty(self::$loggers[$type])) {
            self::$loggers[$type] = new Writer(new Logger($type));
            self::$loggers[$type]->useDailyFiles(storage_path().&#39;/logs/&#39;. $type .&#39;.log&#39;, $day);
        }
 
        $log = self::$loggers[$type];
        return $log;
    }
}

De cette façon, différentes données de journal seront stockées dans différents fichiers journaux. Les informations sur les données du journal peuvent également être enregistrées.

La pile du journal des erreurs de Laravel est trop longue, que dois-je faire ?

Utilisez la classe Blogger ci-dessus et enregistrez les informations d'erreur nécessaires dans start/global.php

// 错误日志信息
App::error(function(Exception $exception, $code)
{
    Log::error($exception);
 
    $err = [
        &#39;message&#39; => $exception->getMessage(),
        &#39;file&#39; => $exception->getFile(),
        &#39;line&#39; => $exception->getLine(),
        &#39;code&#39; => $exception->getCode(),
        &#39;url&#39; => Request::url(),
        &#39;input&#39; => Input::all(),
    ];
    BLogger::getLogger(BLogger::LOG_ERROR)->error($err);
});

Le journal par défaut de Laravel n'utilise pas la segmentation

La journalisation par défaut de Laravel doit donc être modifiée pour être divisée par défaut.

Également dans start/global.php

Log::useDailyFiles(storage_path().'/logs/laravel.log', 30);

Comment enregistrer le journal SQL d'une requête

Cela devrait être Hua a demandé plus en détail, souhaitez-vous enregistrer en temps réel ?

Si vous ne voulez pas d'enregistrement en temps réel, alors laravel a DB::getQueryLog pour obtenir la requête SQL obtenue par une requête d'application :

## 在filters.php中
App::after(function($request, $response)
{
    // 数据库查询进行日志
    $queries = DB::getQueryLog();
    if (Config::get(&#39;query.log&#39;, false)) {
        BLogger::getLogger(&#39;query&#39;)->info($queries);
    }
}

Si vous avez besoin d'un enregistrement en temps réel ( c'est-à-dire que vous êtes dans n'importe quel Lorsque le dé local sort, la requête SQL de la page précédente est également enregistrée), vous devez surveiller l'événement illuminate.query

// 数据库实时请求的日志
if (Config::get(&#39;database.log&#39;, false))
{
    Event::listen(&#39;illuminate.query&#39;, function($query, $bindings, $time, $name)
    {
        $data = compact(&#39;query&#39;,&#39;bindings&#39;, &#39;time&#39;, &#39;name&#39;);
        BLogger::getLogger(BLogger::LOG_QUERY_REAL_TIME)->info($data);
    });
}

Erreur

laravel Toutes les erreurs passeront par l'erreur globale App::error puis apparaîtront

Donc par exemple, si vous concevez une interface et espérez que les données json seront renvoyées même en cas d'erreur se produit, vous pouvez faire ceci :

// 错误日志信息
App::error(function(Exception $exception, $code)
{
    // 如果没有路径就直接跳转到登录页面
    if ($exception instanceof NotFoundHttpException) {
        return Redirect::route(&#39;login&#39;);
    }
 
    Log::error($exception);
 
    $err = [
        &#39;message&#39; => $exception->getMessage(),
        &#39;file&#39; => $exception->getFile(),
        &#39;line&#39; => $exception->getLine(),
        &#39;code&#39; => $exception->getCode(),
        &#39;url&#39; => Request::url(),
        &#39;input&#39; => Input::all(),
    ];
    BLogger::getLogger(BLogger::LOG_ERROR)->error($err);
 
    $response = [
        &#39;status&#39; => 0,
        &#39;error&#39; => "服务器内部错误",
    ];
    return Response::json($response);
});

Si vous souhaitez toujours conserver l'erreur 404 :

App::missing(function($exception)
{
    $response = [
        &#39;status&#39; => 0,
        &#39;error&#39; => "请求路径错误",
    ];
    return Response::json($response);
});

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn