引入

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. Spring中Bean的生命周期是怎样的

    1.Spring对Bean进行实例化(相当于程序中的new Xx()) 2.Spring将值和Bean的引用注入进Bean对应的属性中 3.如果Bean实现了BeanNameAware接口,Sprin ...

  2. datagrid中用tooltip

    function msgFormat(value,row){ value = value.replace(/ /g," "); return '<span title='+ ...

  3. Springboot项目打成war包,部署到tomcat上,正常启动访问报错404

    前言: 项目介绍,此项目是一个Maven多模块项目,模块项目:all(父模块):util (公用的工具类):dao(实体类.业务类.mapper.mapper.xml):business(业务serv ...

  4. 百度之星2017初赛A-1005-今夕何夕

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. 初始化spring容器的几种方法

    package ssh.spring; import java.io.IOException; import org.springframework.beans.factory.BeanFactory ...

  6. SPI笔记

    sclk(serial clock):串行时钟 MOSI(master out slave input)  (master   主机) (slave 从机) MISO(master int slave ...

  7. LeetCode OJ:Palindrome Linked List(回文链表判断)

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  8. [JS学习笔记]Event对象

    写在前面 学习和总结JS时会伴随性的生成一些dome,其中包含一些动态输出的结果和标注. 之前通过鸡贼的办法实现了在博客中执行JS,但很多时候需要一张干净的页面编写dome,所以尝试通过一些在线的JS ...

  9. vue仿京东画线验证码,前端手指位置数据获取

    需求是这样的,京东H5移动端登录,有个安照箭头方向,画线登录的验证,看看是怎么实现的: 直接上代码了: <template> <div v-if="visible" ...

  10. html display和visibility在资源加载上的区别

    想要把一个html里的UI组件设置为可见/不可见,可以用两个属性,display=none/block, visibility=hidden/visible, 网上的解释是display虽然可以让一个 ...