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 相关文章推荐
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
一个典型的PHP分页实例代码分享
Jul 28 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
php中base64_decode与base64_encode加密解密函数实例
Nov 24 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
php事件驱动化设计详解
Nov 10 PHP
Laravel 自带的Auth验证登录方法
Sep 30 PHP
php字符串倒叙
Apr 01 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
计数器详细设计
2006/10/09 PHP
PHP页面中文乱码分析
2013/10/29 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
vue2.0安装style/css loader的方法
2018/03/14 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
python编写微信远程控制电脑的程序
2018/01/05 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
CentOS 7下安装Python3.6 及遇到的问题小结
2018/11/08 Python
Django实现跨域的2种方法
2019/07/31 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
Space NK英国站:英国热门美妆网站
2017/12/11 全球购物
学校七一活动方案
2014/01/19 职场文书
大学生军训广播稿
2014/01/24 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
一分钟演讲稿
2014/04/30 职场文书
期末考试复习计划
2015/01/19 职场文书
责任书格式
2015/01/29 职场文书
校长新学期寄语2016
2015/12/04 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书