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若干单维数组遍历方法的比较
Sep 20 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
php动态函数调用方法
May 21 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 PHP
php文件包含目录配置open_basedir的使用与性能详解
Apr 03 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 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 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
javascript 特殊字符串
2009/02/25 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
python实现树形打印目录结构
2018/03/29 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
Python格式化日期时间操作示例
2018/06/28 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
美国体育用品商店:Rally House(NCAA、NFL、MLB、NBA、NHL和MLS)
2018/01/03 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
银行介绍信范文
2014/01/10 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
董事长岗位职责
2015/02/13 职场文书
小学班主任自我评价
2015/03/11 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python