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者的疑难问答(2)
Oct 09 PHP
在php MYSQL中插入当前时间
Apr 06 PHP
CakePHP去除默认显示的标题及图标的方法
Oct 22 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
Mar 07 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
初识laravel5
Mar 02 PHP
帝国cms目录结构分享
Jul 06 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
Dec 24 PHP
php模拟post提交请求调用接口示例解析
Aug 07 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
解决中英文字符串长度问题函数
2007/01/16 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
php判断变量类型常用方法
2012/04/24 PHP
php实现aes加密类分享
2014/02/16 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
解析python的局部变量和全局变量
2019/08/15 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
通用C#笔试题附答案
2016/11/26 面试题
工程部主管岗位职责
2013/11/17 职场文书
入党积极分子自我鉴定
2014/02/18 职场文书
学习十八大演讲稿
2014/09/15 职场文书
买卖合同协议书范本
2014/10/18 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书