Laravel之Monolog全解析
Laravel是怎样使用monolog的
lv中最常见使用日志的方式:\Illuminate\Support\Facades\Log::error(__CLASS__ . __FUNCTION__ . " xxx failed! $p1 $p2");
用这个例子来分析一下。
首先,看一下\Illuminate\Support\Facades\Log
这个lv的门面类。
<?phpnamespace Illuminate\Support\Facades;/*** @see \Illuminate\Log\Writer*/
class Log extends Facade
{/*** Get the registered name of the component.** @return string*/protected static function getFacadeAccessor(){return 'log';}
}
<?phpnamespace Illuminate\Support\Facades;use Mockery;
use RuntimeException;
use Mockery\MockInterface;<?phpnamespace Illuminate\Support\Facades;use Mockery;
use RuntimeException;
use Mockery\MockInterface;abstract class Facade
{/*** The application instance being facaded.** @var \Illuminate\Contracts\Foundation\Application*/protected static $app;/*** The resolved object instances.** @var array*/protected static $resolvedInstance;......(省略)public static function __callStatic($method, $args){$instance = static::getFacadeRoot();if (! $instance) {throw new RuntimeException('A facade root has not been set.');}switch (count($args)) {case 0:return $instance->$method();case 1:return $instance->$method($args[0]);case 2:return $instance->$method($args[0], $args[1]);case 3:return $instance->$method($args[0], $args[1], $args[2]);case 4:return $instance->$method($args[0], $args[1], $args[2], $args[3]);default:return call_user_func_array([$instance, $method], $args);}}
}
可见关键在其父类Illuminate\Support\Facades\Facade
,这个类有个魔术方法:__callStatic,每当调用一个没有定义的静态函数就会进入这个函数,这个函数就可以处理所有门面函数。但是门面函数运行时候对应的实例是怎么来的呢?我们看到是这个static::getFacadeRoot();
返回的。它是通过框架根据Log门面类的getFacadeAccessor方法返回的类别名log
,再在lv容器中获取log
实例的,而log
对应的实例是在app实例化就一并存在于容器中了。
log
对应的实例类是\Illuminate\Log\Writer
,进入其中就能发现它是对monolog
的一层封装。
ok,以上我们终于跳过了lv框架的这一层封装,如果不能理解上面的内容完全不同担心,lv容器、门面的概念多使用lv做一些东西特别是使用别人开源的lv组件自然就能理解了。
在\Illuminate\Log\Writer
类中是对monolog实例的封装,但是monolog又是什么时候实例化的呢?
在Illuminate\Foundation\Http\Kernel
类中我们可以发现原来是Illuminate\Foundation\Bootstrap\ConfigureLogging这个类,进入它。我们发现$app->instance('log', $log = new Writer(
,就是在这个位置完成了实例化。
new Monolog($app->environment()), $app['events'])
);
monolog日志组件
这是一个强大的php日志组件,很多优秀框架都在使用,关于它的用法最好的文档就是其官方的README了。
Laravel之Monolog全解析相关推荐
- Go modules基础精进,六大核心概念全解析(下)
Go 语言做开发时,路径是如何定义的?Go Mudules又为此带来了哪些改变?本文将会全面介绍Go Modules六大核心概念,包括了设计理念与兼容性原则等,掌握这些技术点对于管理和维护Go 模块有 ...
- 第四章:Spring项目文件上传两种方式(全解析)
欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...
- 阿里秋招面试全解析(含内推岗)
每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...
- Vuebnb:一个用vue.js和Laravel构建的全栈应用
2019独角兽企业重金招聘Python工程师标准>>> 今年我一直在写一本新书叫全栈Vue网站开发:Vue.js,Vuex和Laravel.它会在Packt出版社在2018年初出版. ...
- Apache Web服务器访问控制机制全解析
Apache Web服务器访问控制机制全解析 原文请见: http://netsecurity.51cto.com/art/201102/245666.htm Linux下的Aapche服务器提供了强 ...
- 6.15 Unity引擎渲染效率全解析
UWA新晋主播赵福恺从Unity渲染模块中的各种渲染效果性能.PBR渲染性能以及阴影的渲染性能三个角度分别进行了详细的分析总结.为响应各大听众的需求,小编奉上完整视频回顾,同时也向看完直播才下班的五好 ...
- python读取txt文件写入-Python读写txt文本文件的操作方法全解析
一.文件的打开和创建 >>> f = open('/tmp/test.txt') >>> f.read() 'hello python! hello world! ...
- jQuery Ajax 实例 全解析(转)
jQuery Ajax 实例 全解析 jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我 ...
- Fragment全解析系列
文/YoKey(简书作者) 原文链接:http://www.jianshu.com/p/d9143a92ad94 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". F ...
最新文章
- 让我们定义一个ggplot版本的华夫饼图吧
- Google Maps Android API V2的使用及问题解决
- 真是虚惊一场的i_like_cpp
- ajax该什么时候用
- 刷题总结——瞭望塔(bzoj1038)
- 60-172-010-使用-Broadcast-简介
- java服务器返回错误码,java - java.io.IOException:服务器返回URL的HTTP响应代码:409 - 堆栈内存溢出...
- ppt设置外观样式_PPT办公技巧:PPT内置主题样式的3种运用办法
- learn to study
- Spark深入浅出企业级最佳实践
- 常微分方程的数值解法
- MySQL数据库介绍
- OPPO a1刷机包下载_OPPOA1密码忘记了?来这里搞定
- OpenGl读取导入3D模型并且添加鼠标移动旋转显示
- Windows Defender怎么添加排除项?
- Ubuntu连接蓝牙鼠标键盘
- Typescript 类型推断
- JavaScript 什么是函数式编程
- mysql root密码是什么_mysql如何查看root密码是什么
- 数据骗子无处不在,教你拆穿所谓“万金油”