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 25 PHP
php 处理上百万条的数据库如何提高处理查询速度
Feb 08 PHP
php 字符串替换的方法
Jan 10 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
thinkphp autoload 命名空间自定义 namespace
Jul 17 PHP
轻松掌握php设计模式之访问者模式
Sep 23 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
May 06 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 PHP
windows系统php环境安装swoole具体步骤
Mar 04 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 smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php5.3 注意事项说明
2013/07/01 PHP
php 批量添加多行文本框textarea一行一个
2014/06/03 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
javascript 常用代码技巧大收集
2009/02/25 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
Python绘制3D图形
2018/05/03 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
数字天堂软件测试面试题
2012/12/23 面试题
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
投标单位介绍信
2014/01/09 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
设备技术员岗位职责
2015/04/11 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
创业计划书之都市休闲农庄
2019/12/28 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL