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中的 == 运算符进行字符串比较
Nov 26 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
php生成动态验证码gif图片
Oct 19 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
常用PHP封装分页工具类
Jan 14 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
May 05 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
Jun 03 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调用数据库的存贮过程
2006/10/09 PHP
建立文件交换功能的脚本(二)
2006/10/09 PHP
php中OR与|| AND与&amp;&amp;的区别总结
2013/10/26 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
php中JSON的使用方法
2015/04/30 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
基于python实现计算两组数据P值
2020/07/10 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers