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编程语言开发动态WAP页面
Oct 09 PHP
深入解析php模板技术原理【一】
Jan 10 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
php实现读取手机客户端浏览器的类
Jan 09 PHP
php操作xml入门之cdata区段
Jan 23 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
PHP安装BCMath扩展的方法
Feb 13 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
JavaScript实现的字符串replaceAll函数代码分享
2015/04/02 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
PHP7新特性简述
2017/06/11 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
Django和Flask框架优缺点对比
2019/10/24 Python
学python需要去培训机构吗
2020/07/01 Python
Python学习之time模块的基本使用
2021/01/17 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
农村产权制度改革实施方案
2014/03/21 职场文书
节约用水的口号
2014/06/20 职场文书
离婚纠纷代理词
2015/05/23 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python