引入

composer require monolog/monolog

官网

https://github.com/Seldaek/monolog

创建工具类

<?php
/**
* Created by PhpStorm.
* User: jiqing
* Date: 18-6-27
* Time: 上午11:19
*/ require '../vendor/autoload.php'; use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Processor\UidProcessor;
use Monolog\Processor\ProcessIdProcessor;
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\JsonFormatter; class MyLog {
public static function setLog($content = [],$msg = "msg",$level = Logger::NOTICE ,$name = "jq",$formatter = "line",$path = "/tmp/jq.log") {
// create a log channel
$log = new Logger($name);
$stream_handler = new StreamHandler($path, Logger::DEBUG); // 过滤级别
switch (strtolower($formatter)) {
case "line":
$stream_handler->setFormatter(new LineFormatter());
break;
case "json":
$stream_handler->setFormatter(new JsonFormatter());
break;
default:
}
$log->pushHandler($stream_handler);
$uid_obj = new UidProcessor();
$log->pushProcessor($uid_obj); $pid_obj = new ProcessIdProcessor();
$log->pushProcessor($pid_obj); // add records to the log
switch (strtoupper($level)) {
case Logger::DEBUG:
case 1:
case "DEBUG":
$log->debug($msg,$content);
break;
case Logger::INFO:
case 2:
case "INFO":
$log->info($msg,$content);
break;
case Logger::NOTICE:
case 3:
case "NOTICE":
$log->notice($msg,$content);
break;
case Logger::WARNING:
case 4:
case "WARNING":
$log->warning($msg,$content);
break;
case Logger::ERROR:
case 5:
case "ERROR":
$log->error($msg,$content);
break;
case Logger::CRITICAL:
case 6:
case "CRITICAL":
$log->critical($msg,$content);
break;
case Logger::ALERT:
case 7:
case "ALERT":
$log->alert($msg,$content);
break;
case Logger::EMERGENCY:
case 8:
case "EMERGENCY":
$log->emergency($msg,$content);
break;
default:
$log->debug($msg,$content);
} return $uid_obj->getUid();
}
}

创建测试类

<?php
/**
* Created by PhpStorm.
* User: jiqing
* Date: 18-6-27
* Time: 上午11:23
*/ class TestAction extends IndexAction
{
public function testLog() {
vendor('Log.MyLog');
MyLog::setLog("content1");
MyLog::setLog("content2","");
MyLog::setLog("content3","","error");
MyLog::setLog("content4","","5");
MyLog::setLog("content5","","400");
MyLog::setLog("content6","","400","jiqing","json");
MyLog::setLog("content7","","400","jiqing","line");
MyLog::setLog(["content8"],"","400","jiqing","line");
MyLog::setLog(["content8"],"","400","jiqing","line","/tmp/jq.log");
MyLog::setLog(["content8"],"","400","jiqing","line","/tmp/jq.log");
}
}

查看结果

[2018-06-27 12:55:24] jq.NOTICE: msg content1 {"process_id":2729,"uid":"ecbd811"}
[2018-06-27 12:55:24] jq.NOTICE: content2 {"process_id":2729,"uid":"4b2041e"}
[2018-06-27 12:55:24] jq.ERROR: content3 {"process_id":2729,"uid":"805f3d6"}
[2018-06-27 12:55:24] jq.ERROR: content4 {"process_id":2729,"uid":"c3c1706"}
[2018-06-27 12:55:24] jq.ERROR: content5 {"process_id":2729,"uid":"c01087f"}
{"message":"","context":"content6","level":400,"level_name":"ERROR","channel":"jiqing","datetime":{"date":"2018-06-27 12:55:24.037391","timezone_type":3,"timezone":"PRC"},"extra":{"process_id":2729,"uid":"f4528b7"}}
[2018-06-27 12:55:24] jiqing.ERROR: content7 {"process_id":2729,"uid":"532ac58"}
[2018-06-27 12:55:24] jiqing.ERROR: ["content8"] {"process_id":2729,"uid":"3d5751c"}

它支持功能很多,这里只是其中的一小部分。可以line展示,可以json展示,可以html展示结果。

可以记录每一次的进程id,每一次用户id。记录时间。

内容支持字符串,支持数组。

可以支持日志级别。

可以设置名称,区分是谁操作的。

很牛逼。

ps:学会封装,学会分层。

monolog 应该是世界上最好的日志插件了的更多相关文章

  1. 这可能是php世界中最好的日志库——monolog

    由于一些历史原因,php中并没有内建的日志接口,故长期以来也没一个功能完备并且应用广泛的日志库.在我的工作生涯中,如果系统需要记录一些应用日志的话,基本上就是封装一个日志类,然后把一些要记录的字段写入 ...

  2. Git是目前世界上最先进的分布式版本控制系统

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  3. 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

    为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...

  4. Nivo Slider - 世界上最棒的 jQuery 图片轮播插件

    Nivo Slider 号称世界上最棒的图片轮播插件,有独立的 jQuery 插件和 WordPress 插件两个版本.目前下载量已经突破 1,800,000 次!jQuery 独立版本的插件主要有如 ...

  5. 世界上不存在什么RedBSD,SuseBSD或者ArchBSD,Turb...

    世界上不存在什么RedBSD,SuseBSD或者ArchBSD,TurboBSD之类的东西.

  6. hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  7. 世界上最方便的SharePoint移动客户端--Rshare

    Rshare我试用了一段时间,同时也测试了其他家产品,使用后的感觉是Rshare无愧于世界上最方面的SharePoint移动客户端. 1.界面设计很方便,设计中充分考虑到移动客户的使用习惯及喜好,设计 ...

  8. HDU-4515 小Q系列故事——世界上最遥远的距离

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  9. Smartdraw世界上最流行的商业绘图软件

    Smartdraw 更多图片(5张) SmartDraw是世界上最流行的商业绘图软件.2006 年获美国政府司法部 (U.S. Department of Justice) 专用软件,2007获美国政 ...

随机推荐

  1. es6 中的let,const

    在es6中,let的作用和var差不多,都是用来声明变量的,但是他们之间的区别在于作用域不同,大家都知道在js中没有块级作用域,例如: for(var i=0;i<10;i++){ consol ...

  2. MySQL 入门篇

    历史 MySQL 是由 David Axmark.Allan Larsson 和 Michael Widenius 3 个瑞典人于 20 世纪 90 年代开发的一个关系型数据库.MySQL 之名取自创 ...

  3. selenium学习笔记(webdriver下载配置)

    selenium安装后默认安装firefox可以直接使用,当然可以通过其它浏览器 博主这里整理了:chrome . IE 首先是下载地址 http://docs.seleniumhq.org/down ...

  4. spring3: 访问Resource — ResourceLoader/ResourceLoaderAware接口

    4.3.1  ResourceLoader接口 ResourceLoader接口用于返回Resource对象:其实现可以看作是一个生产Resource的工厂类. public interface Re ...

  5. srs部署到ubuntu 18.04 server

    srs.txt ubuntu 18.04 安装 srs 1. 上传srs_40.7z和h2ws.7z到linux服务器,然后远程ssh连接 (假设登陆用户名是bob,linux服务器ip是192.16 ...

  6. 牛客比赛-Wannafly9-A/B/C

    A-链接:https://www.nowcoder.com/acm/contest/71/A来源:牛客网 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数 ...

  7. com.itnba.maya.domel.Diaoyantimu_$$_javassist_1 cannot be cast to javassist.util.proxy.Proxy错误问题解决方法

    控制台报错显示: com.itnba.maya.domel.Diaoyantimu_$$_javassist_1 cannot be cast to javassist.util.proxy.Prox ...

  8. 模拟form提交数据

    最近在做一个项目,发现ajax不能enctype=”multipart/form-data” 属性的表单,没办法,只能使用form表单直接提交的方法了,但是form表单直接提交会跳转页面,这样很不友好 ...

  9. 剑指offer--26.顺时针打印矩阵

    1,2,3,45,6,7,88,10,11,1213,14,15,16 每次输出第一行,然后删除第一行,逆时针旋转剩下的矩阵. ------------------------------------ ...

  10. Dojo Chart之常用统计图

    很多做web的都知道,在很多web系统中会涉及到一些统计图,例如饼状图,柱状图.趋势图.以及叠加图等.提到这儿,做web的都很熟悉的,jquery的highcharts就能搞定所有的涉及到统计图的功能 ...