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中的错误与日志的更多相关文章
- Laravel中的日志与上传
PHP中的框架众多,我自己就接触了好几个.大学那会啥也不懂啥也不会,拿了一个ThinkPHP学了.也许有好多人吐槽TP,但是个人感觉不能说哪个框架好,哪个框架不好,再不好的框架你能把源码读上一遍,框架 ...
- laravel中日志为daily时如何设置最大保存天数
在laravel中,日志设置为daily时,默认保存七天的日志,超过则清除七天前的日志.可修改默认的设置,假如要保存30天的日志,则配置如下: 在配置文件config/app.php中添加如下代码: ...
- Laravel 中的异常处理
这篇文章里,我们将研究 Laravel 框架中最重要也最少被讨论的功能 -- 异常处理. Laravel 自带了一个异常处理类,它能够让你以简单.优雅的方式 report 和 render 异常. 文 ...
- PHP中的错误处理、异常处理机制详解
在编写PHP程序时,错误处理是一个重要的部分.如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); / ...
- Yii中的错误及异常处理
Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...
- iOS 中捕获程序崩溃日志
iOS 中捕获程序崩溃日志 (2014-04-22 17:35:59) 转载▼ iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下 ...
- 为Secure Store Service生成新密钥,解决“生成密钥过程中发现错误”的问题
我们集成TFS和SharePoint Server以后,一个最常见的需求是通过SharePoint Server的Excel Service读取TFS报表中的信息,利用Excel Service的强大 ...
- PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别
[PHP 配置文件中与错误相关的选项 ] 选项 描述 error_reporting 设置错误报告的级别 display_errors 是否显示错误 log_errors 设置是否将错误信息记录到日志 ...
- PHP中的错误处理和异常处理
错误处理: 1.语法错误 2.运行时的错误 3.逻辑错误 错误报告: 错误E_ERROR 警告E_WARNING 注意E_NOTICE 开发 ...
随机推荐
- Hello Raspberry Pi
Raspberry Pi 入手好一段时间了,原意是想撸 linux,但是后来一整年都在忙孩子房子户口本子的事,这玩意也就搁了一年尘. 最近终于被生活折腾到了尾声,开始找一些东西来折腾折腾. 一.什么是 ...
- java提高篇(十)-----详解匿名内部类
在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...
- Unity3D音乐音效研究-MIDI与波表
其实音乐音效这个命题本身没什么好研究的. Unity3D提供了丰富的结构和使用方式,足够使用了. 但是我有一些小小的想法和需求,一般的Unity资料并没有给我答案. 一个是容量要小.MP3.OGG的高 ...
- Asp.net MVC JsonResult 忽略属性
指定 JavaScriptSerializer 不序列化公共属性或公共字段.无法继承此类. 命名空间: System.Web.Script.Serialization 程序集: System.We ...
- [ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭
1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列 ...
- ueditor上传大容量视频报http请求错误的解决方法
故障现象: 当使用百度编辑器ueditor上传大容量视频或大容量图片的时候,编辑器报"http请求错误"的解决方法详解: 原因分析: 目前很多CMS整合了百度的ueditor编辑器 ...
- java数学函数库 API(转)
原文地址:http://www.24xuexi.com/w/2011-11-08/98206.html 首先给大家看看Math类所提供的主要方法,下面的列表给出了Math类的主要方法,如果要理解Mat ...
- 大叔也说Xamarin~Android篇~日志的记录
回到目录 无论哪个平台,开始哪种应用程序,日志总是少不了的,大家在Lind.DDD里也可以看到大叔的日志组件,而在xamarin进行移动开发时,为了更好的调试,记录运行的情况,日志也是必须的,这讲主要 ...
- Yii 框架学习--01 框架入门
Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...
- Atitti css transition Animation differ区别
Atitti css transition Animation differ区别 1.1. transition的优点在于简单易用,但是它有几个很大的局限. 1 1.2. Transition ...