须知

  • 该打印log的代码出自wxPay支付样例里的 log.php 文件
  • 使用该文件时,直接引入即可, 但是需要在同级目录下手动创建logs文件夹

使用样例

require_once "log.php"Log::INFO("使用打印日志");

源码

<?phpinterface ILogHandler
{public function write($msg);}class CLogFileHandler implements ILogHandler
{private $handle = null;public function __construct($file = ''){$this->handle = fopen($file, 'a');}public function write($msg){fwrite($this->handle, $msg, 4096);}public function __destruct(){fclose($this->handle);}
}class Log
{private $handler = null;private $level = 15;private static $instance = null;private function __construct(){}private function __clone(){}public static function Init($handler = null, $level = 15){if (!self::$instance instanceof self) {self::$instance = new self();self::$instance->__setHandle($handler);self::$instance->__setLevel($level);}return self::$instance;}private function __setHandle($handler){$this->handler = $handler;}private function __setLevel($level){$this->level = $level;}public static function DEBUG($msg){self::$instance->write(1, $msg);}public static function WARN($msg){self::$instance->write(4, $msg);}public static function ERROR($msg){$debugInfo = debug_backtrace();$stack = "[";foreach ($debugInfo as $key => $val) {if (array_key_exists("file", $val)) {$stack .= ",file:" . $val["file"];}if (array_key_exists("line", $val)) {$stack .= ",line:" . $val["line"];}if (array_key_exists("function", $val)) {$stack .= ",function:" . $val["function"];}}$stack .= "]";self::$instance->write(8, $stack . $msg);}public static function INFO($msg){self::$instance->write(2, $msg);}private function getLevelStr($level){switch ($level) {case 1:return 'debug';break;case 2:return 'info';break;case 4:return 'warn';break;case 8:return 'error';break;default:break;}}protected function write($level, $msg){if (($level & $this->level) == $level) {$msg = '[' . date('Y-m-d H:i:s') . '][' . $this->getLevelStr($level) . '] ' . $msg . "\n";$this->handler->write($msg);}}
}//初始化日志
$logHandler = new CLogFileHandler("logs/" . date('Y-m-d') . '.log');
$log = Log::Init($logHandler, 15);

PHP打印输出log相关推荐

  1. 如何分析Android的Log

    转载自 http://www.2cto.com/kf/201405/297264.html 首先,让我们看一看AndroidLog的格式.下面这段log是以所谓的long格式打印出来的.从前面Logc ...

  2. 飞桨上线万能转换小工具,教你玩转TensorFlow、Caffe等模型迁移

    百度推出飞桨(PaddlePaddle)后,不少开发者开始转向国内的深度学习框架.但是从代码的转移谈何容易,之前的工作重写一遍不太现实,成千上万行代码的手工转换等于是在做一次二次开发. 现在,有个好消 ...

  3. 从零开始学习docker(十二)介绍Docker Compose基本使用

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 默认情况下在mac或者Windows安装docker的时候会自动安装docker-compose.对于Linux ...

  4. Android代码模拟物理、屏幕点击事件

    一.应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) {long dow ...

  5. python3中超级好用的日志模块-loguru模块详解

    一. 使用logging模块时 用python写代码时,logging模块最基本的几行配置,如下: import logging logging.basicConfig(level=logging.I ...

  6. 飞桨万能转换小工具X2Paddle,教你玩转模型迁移

    百度推出飞桨(PaddlePaddle)后,不少开发者开始转向国内的深度学习框架.但是从代码的转移谈何容易,之前的工作重写一遍不太现实,成千上万行代码的手工转换等于是在做一次二次开发. 现在,有个好消 ...

  7. 在mm32f3270为micropython创建Pin模块(1)

    在mm32f3270为micropython创建Pin模块(1) 苏勇,2021年8月 文章目录 在mm32f3270为micropython创建Pin模块(1) Requirements 代码框架 ...

  8. 精品连载丨安卓 App 逆向课程之五 frida 注入 Okhttp 抓包下篇

    本篇内容是「肉丝姐教你安卓逆向之 frida 注入 Okhttp 抓包系列的第三篇,建议配合前两篇一起阅读,效果更佳. 精品连载丨安卓 App 逆向课程之三 frida 注入 Okhttp 抓包上篇 ...

  9. Redisson_布隆过滤器

    应用场景 去重 诞生背景 Java应用一般通过JDK自身提供的HashSet去重,通过contains()方法判断当前元素是否存在于Set中.该方式要求在调用contains()前,已经将数据列表加载 ...

最新文章

  1. 从网站上扒网页,保存为file文件格式
  2. 每日一皮:当我在处理别人的代码时...
  3. 吉林大学计算机学院男女,吉林大学非诚勿扰千人观看 22位男女同学一同相亲...
  4. keras 时间序列分析
  5. 协方差矩阵的概念,算法以及自己的一些理解
  6. php mysql ajax 分页_ajax+php+mysql无刷新分页代码(1/2)_PHP教程
  7. 爬虫必须学会的正则表达式
  8. MaxEnt: 最大熵模型(Maximum Entropy Models)(二)
  9. F5获取vs、pool、member当前、峰值、总计连接数的oid
  10. ae万能弹性表达式_干货丨AE表达式知多少?4大常用表示式解决80%难题
  11. 瑞星杀毒软件linux序列号,瑞星杀毒软件2007光盘零售版是面向 Linux的?
  12. Ubuntu以及CentOS7修改ssh端口号详细步骤
  13. 一个Vue+Canvas的酷炫后台管理
  14. coco2d-x 或者 creator 实现物体点击后的果冻效果
  15. keychron机械键盘使用感受
  16. shell sed(流编辑器)的基本使用
  17. DNS查询的命令行工具
  18. 3D步进式全景漫游解决方案,虚拟全景解决方案,一步一景全景解决方案
  19. 4.6Android灯光系统-背光灯
  20. iSpring Suite教程:使用iSpring创建视频讲座只需简单6步

热门文章

  1. mysql 视图报错1356,mysql视图初探 - osc_ky6f5kf1的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. JavaScript 判断对象中属性的值是否空,如果为空,则删除该属性
  3. 浏览器内核Gecko与WebKit哪个性能更强大
  4. java对象与byte[]数组之间的相互转化,压缩解压缩操作
  5. winds_mysql8.0安装方法
  6. 计算机芯片记忆方法,神奇的万能记忆芯片作文
  7. 完美迁移C盘已装软件与游戏,无需重新安装~
  8. 开发中遇到的bug-Property or method “xxxx“ is not defined on the instance but referenced during render.
  9. 微软的应试题完整版(附答案)
  10. 【转载】CMD命令大全