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 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
生成静态页面的php函数,php爱好者站推荐
Mar 19 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
PHP常用开发函数解析之数组篇[未完结]
Jul 30 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
php常用数学函数汇总
Nov 21 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
Jan 23 PHP
PHP实现的AES 128位加密算法示例
Sep 16 PHP
php数值计算num类简单操作示例
May 15 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
PR值查询 | PageRank 查询
2006/12/20 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
用js实现放大镜效果
2020/10/28 Javascript
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
Python线性方程组求解运算示例
2018/01/17 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
python matlibplot绘制3D图形
2018/07/02 Python
Linux下多个Python版本安装教程
2018/08/15 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
Python类的动态绑定实现原理
2020/03/21 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
纽约家具、家居装饰和地毯店:ABC Carpet & Home
2017/06/21 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
高职教师先进事迹材料
2014/08/24 职场文书
会议简讯范文
2015/07/20 职场文书
详解Vue router路由
2021/11/20 Vue.js
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android