引入

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. 一些官方的github地址

    阿里巴巴开源github地址:https://github.com/alibaba 腾讯开源github地址:https://github.com/Tencent 奇虎360github地址:http ...

  2. hackerrankWeek of Code 32

    hackerrankWeek of Code 32 A.Duplication B.Fight the Monsters! C.Circular Walk D.Geometric Trick E.Ba ...

  3. angular2-scroll-module

    这篇介绍一下,写一个自己的angular2滚动监听插件 目录结构: /scrollModule: ztw-scroll.module.ts; scrollBind.directive.ts; scro ...

  4. 命令行连接db2数据库

    在cmd界面执行db2cmd命令 然后在db2cmd界面执行db2命令 然后执行 CONNECT TO UIBS USER DB2INST1 USING 123456命令

  5. [eShopOnContainers 学习系列] - 00 - 开发环境需求

    开发环境需求 https://github.com/dotnet-architecture/eShopOnContainers/wiki/00.-Dev-machine-requirements 我的 ...

  6. shell编程学习1

    1.shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式.    (2)我们可以使用shell和操作系统.uboot等软件系统进 ...

  7. Git_学习_11_Git rebase合并提交信息

    一.前言 二.操作过程 (1)先后两次进行文件修改,然后提交到本地仓库. (2)使用 git rebase -i origin/dev 来合并提交信息. 会弹出一个编辑框 p 07c5abd Intr ...

  8. Flask的消息message机制flash

    Flask的消息机制flash message是一个基于session实现的用于保存数据的集合,其特点是:使用一次就删除. 原理就是 操作成功 session['操作'] = 'msg' # 设置 s ...

  9. Leetcode 807. Max Increase to Keep City Skyline

    class Solution(object): def maxIncreaseKeepingSkyline(self, grid): """ :type grid: Li ...

  10. php语法笔记

    1.  php中设置页面的编码方式: header(“content-type:text/html;charset=utf-8”); 2.  数据类型 布尔类型:Boolean/bool:true.f ...