laravel中的错误与日志用法详解


Posted in PHP onJuly 26, 2016

本文实例讲述了laravel中的错误与日志用法。分享给大家供大家参考,具体如下:

日志

laravel中的日志是基于monolog而封装的。laravel在它上面做了几个事情:

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

② 增加了useFiles和useDailyFiles两个参数,使得做日志管理和切割变的容易了

③ 如果要调用monolog的方法需要调用callMonolog函数

好了,看下下面几个需求怎么实现:

将不同的日志信息存放到不同的日志中去

这个需求很普遍的,比如调用订单的日志,需要记录到order.log,获取店铺信息的记录需要记录到shop.log中去。可以这么做:

<?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的错误日志堆栈太长了,怎么办?

使用上面的BLogger类,在start/global.php记录下必要的错误信息

// 错误日志信息
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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php的字符串用法小结
Jun 08 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
CI框架文件上传类及图像处理类用法分析
May 18 PHP
谈谈PHP连接Access数据库的注意事项
Aug 12 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
Jun 02 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 PHP
PHP fopen函数用法实例讲解
Feb 15 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 PHP
Laravel4中的Validator验证扩展用法详解
Jul 26 #PHP
laravel5创建service provider和facade的方法详解
Jul 26 #PHP
Laravel5权限管理方法详解
Jul 26 #PHP
JavaScript实现删除电脑的关机键
Jul 26 #PHP
php 读取输出其他文件的实现方法
Jul 26 #PHP
php实现贪吃蛇小游戏
Jul 26 #PHP
ThinkPHP和UCenter接口冲突的解决方法
Jul 25 #PHP
You might like
PHP 批量更新网页内容实现代码
2010/01/05 PHP
php动态绑定变量的用法
2015/06/16 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
python实现图片批量剪切示例
2014/03/25 Python
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
Python实现获取网站PR及百度权重
2015/01/21 Python
理解python正则表达式
2016/01/15 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
python将pandas datarame保存为txt文件的实例
2019/02/12 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
PyQt5 多窗口连接实例
2019/06/19 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
天网面试题
2013/04/07 面试题
基于Python 函数和方法的区别说明
2021/03/24 Python
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
书香校园活动方案
2014/02/28 职场文书
前台岗位职责范本
2015/04/16 职场文书
我是特种兵观后感
2015/06/11 职场文书
python单元测试之pytest的使用
2021/06/07 Python
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python