laravel中的错误与日志用法详解,Laravel框架达成的笔录SQL日志功用示例

正文实例陈说了Laravel框架达成采纳中间件进行操作日志记录成效。分享给我们供大家参谋,具体如下:

正文实例陈说了Laravel框架达成的记录SQL日志功用。分享给大家供大家参谋,具体如下:

本文实例汇报了laravel中的错误与日志用法。分享给大家供大家参照他事他说加以调查,具体如下:

应用中间件进行操作日志记录进程:

在项目支出进度中依然是性质优化中,平日会有要翻开执行sql的意况,然则Laravel日志暗许不记录执行sql。还好留有相关接口,大家能够异常低价的就是想SQl日志功用。

日志

1、创建中间件

在 App\Providers\伊夫ntServiceProvider:class
中的$listen中新扩张如下

laravel中的日志是依靠monolog而卷入的。laravel在它上边做了多少个事情:

php artisan make:middleware AdminOperationLog
protected $listen = [
  'App\Events\Event' => [
    'App\Listeners\EventListener',
  ],
  // 新增SqlListener监听QueryExecuted
  'Illuminate\Database\Events\QueryExecuted' => [
    'App\Listeners\SqlListener',
  ],
];

① 把monolog中的addInfo等函数简化成为了info那样的函数

2、生成了文本./app/Http/Middleware/AdminOperationLog.php

新建SqlListener监听器

② 扩张了useFiles和useDailyFiles三个参数,使得做日志管理和切割变的轻易了

代码如下:

方法1,手动成立,在App\Listeners\SqlListener.php
文件,内容如下

③ 假诺要调用monolog的办法须求调用callMonolog函数

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Models\OperationLog;
class AdminOperationLog
{
  /**
   * Handle an incoming request.
   *
   * @param \Illuminate\Http\Request $request
   * @param \Closure $next
   * @return mixed
   */
  public function handle($request, Closure $next)
  {
    $user_id = 0;
    if(Auth::check()) {
      $user_id = (int) Auth::id();
    }
    $_SERVER['admin_uid'] = $user_id;
    if('GET' != $request->method()){
      $input = $request->all();
      $log = new OperationLog(); # 提前创建表、model
      $log->uid = $user_id;
      $log->path = $request->path();
      $log->method = $request->method();
      $log->ip = $request->ip();
      $log->sql = '';
      $log->input = json_encode($input, JSON_UNESCAPED_UNICODE);
      $log->save();  # 记录日志
    }
    return $next($request);
  }
}
namespace App\Listeners;
use Illuminate\Database\Events\QueryExecuted;
class SqlListener {
  /**
   * Create the event listener.
   *
   * @return void
   */
  public function __construct() {
    //
  }
  /**
   * Handle the event.
   *
   * @param =QueryExecuted $event
   * @return void
   */
  public function handle(QueryExecuted $event) {
    // 在这里编写业务逻辑
  }
}

好了,看下上边多少个须要怎么落到实处:

3、中间件引入 ./app/Http/Kernel.php

方法2,使用命令行创造,命令如下

将差别的日志音信寄存到不一致的日记中去

protected $middlewareGroups = [
    'web' => [
      ...
      \App\Http\Middleware\AdminOperationLog::class,
      ...
    ],
    'api' => [
      'throttle:60,1',
      'bindings',
    ],
  ];
// 该命令必须在项目跟目录下执行,因为项目跟目录下才有artisan文件。
// 该命令可以自动创建SqlListener文件,但是QueryExecuted这个类的导入可能会有点问题,自己改下。

> php artisan make:listener SqlListener -e=QueryExecuted

那个须求很宽泛的,举个例子调用订单的日记,需求记录到order.log,获取集团新闻的记录必要记录到shop.log中去。能够如此做:

那时候开展操作时就能够记录操作日志

在handle方法中编辑记录sql的事体逻辑,如:

<?php 
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Illuminate\Log\Writer;
class BLogger
{
  // 所有的LOG都要求在这里注册
  const LOG_ERROR = 'error';
  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().'/logs/'. $type .'.log', $day);
    }
    $log = self::$loggers[$type];
    return $log;
  }
}

越来越多关于Laravel相关内容感兴趣的读者可查阅本站专项论题:《Laravel框架入门与升级教程》、《php优良开采框架总计》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作能力汇总》

/**
 * Handle the event.
 *
 * @param =QueryExecuted $event
 * @return void
 */
public function handle(QueryExecuted $event) {
  $sql = str_replace("?", "'%s'", $event->sql);
  $log = vsprintf($sql, $event->bindings);
  $log = '[' . date('Y-m-d H:i:s') . '] ' . $log . "\r\n";
  $filepath = storage_path('logs\sql.log');
  file_put_contents($filepath, $log, FILE_APPEND);
  // 这里也可以直接用Log::info() 里的函数,只是这样会和其他调试信息掺在一起。
  // 如果要用Log里的函数,别忘记了引入Log类。
}

如此那般不相同的日记数据会被积累到分裂的日志文件中去。还能够记录日志数据新闻。

希望本文所述对大家基于Laravel框架的PHP程序设计有着帮忙。

越来越多关于Laravel相关内容感兴趣的读者可查阅本站专项论题:《Laravel框架入门与晋级教程》、《php杰出开采框架计算》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技能汇总》

laravel的失实日志酒店太长了,咋办?

你或然感兴趣的文章:

  • Laravel日志用法详解
  • laravel中的错误与日志用法详解
  • 采纳Laravel事件系统怎么着贯彻登入日志的记录详解
  • Laravel给生产意况加多监听事件(SQL日志监听)
  • Laravel 5.3 学习笔记之
    错误&日志
  • Laravel框架达成的记录SQL日志效用示例
  • Laravel5.5以下版本中怎样自定义日志行为详解
  • PHP的Laravel框架结合MySQL与Redis数据库的行使安顿
  • Laravel框架使用monolog_mysql完结将系统日志消息保存到mysql数据库的法子

梦想本文所述对我们基于Laravel框架的PHP程序设计有着扶助。

使用方面的BLogger类,在start/global.php记录下必备的错误音信

您恐怕感兴趣的篇章:

  • Laravel日志用法详解
  • laravel中的错误与日志用法详解
  • 应用Laravel事件系统怎样贯彻登陆日志的记录详解
  • Laravel给生产条件增多监听事件(SQL日志监听)
  • Laravel 5.3 学习笔记之
    错误&日志
  • Laravel框架达成利用中间件举办操作日志记录成效
  • Laravel5.5以下版本中怎样自定义日志行为详解
  • PHP的Laravel框架结合MySQL与Redis数据库的使用布置
  • Laravel框架使用monolog_mysql完成将系统日志新闻保存到mysql数据库的点子
// 错误日志信息
App::error(function(Exception $exception, $code)
{
  Log::error($exception);
  $err = [
    'message' => $exception->getMessage(),
    'file' => $exception->getFile(),
    'line' => $exception->getLine(),
    'code' => $exception->getCode(),
    'url' => Request::url(),
    'input' => Input::all(),
  ];
  BLogger::getLogger(BLogger::LOG_ERROR)->error($err);
});

laravel默许的日记未有选取剪切

于是应当暗中同意把laravel的暗中认可日志记录改成有分割的。

同样在start/global.php中

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

如何记录三个伸手的sql日志

本条理应再细化问,你是还是不是要实时记录?

万一不用实时记录,那么laravel有个DB::getQueryLog能够赢得贰个app伏乞获收取来的sql诉求:

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

假若你是要求实时记录的(也正是您在其余地方die出来的时候,在此之前的页面包车型地铁sql央求也许有记录)的话,你就需求监听illuminate.query事件了

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

错误

laravel的装有错误集会场全数过global的App::error再出去

为此比如你安排的是接口,希望纵然有error现身也回到json数据,则足以那样做:

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

一经你还希望将404错误也hold住:

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

更多关于Laravel相关内容感兴趣的读者可查阅本站专项论题:《Laravel框架入门与进级教程》、《php非凡开辟框架总括》、《smarty模板入门基础教程》、《php日期与时光用法总括》、《php面向对象程序设计入门教程》、《php字符串(string)用法总括》、《php+mysql数据库操作入门教程》及《php常见数据库操作本领汇总》

仰望本文所述对我们基于Laravel框架的PHP程序设计有着支持。

您也许感兴趣的篇章:

  • Laravel日志用法详解
  • 选用Laravel事件系统如何促成登陆日志的记录详解
  • Laravel给生产条件增添监听事件(SQL日志监听)
  • Laravel 5.3 学习笔记之
    错误&日志
  • Laravel框架达成的记录SQL日志功用示例
  • Laravel框架完毕选用中间件实行操作日志记录成效
  • Laravel5.5以下版本中怎样自定义日志行为详解
  • PHP的Laravel框架结合MySQL与Redis数据库的运用布署
  • Laravel框架使用monolog_mysql达成将系统日志消息保存到mysql数据库的方法