由于一些历史原因,php中并没有内建的日志接口,故长期以来也没一个功能完备并且应用广泛的日志库

monolog是一个符合当前最新行业规范的日志库。更专业点就不多说了,免得大家看的头大了。

引入monolog:

composer require monolog/monolog

mongolog中几个重要的概念

一、handler日志管理器

存放handler的数据结构是一个“栈”,一个日志实例可以有多个handler,通过Logger实例的pushHandler方法压入一个handler,该方法接受一个HandlerInterface类型的参数。

如果你设置了多个handler,当你新增一条日志的时候,他会从栈顶开始往下传播,关心这个级别日志的handler将会处理这条日志

所有的handler都会继承AbstractProcessingHandler这个抽象类,并且只需要实现里面的抽象方法write就可以了

同时这个抽象类会继承AbstractHandler这个抽象类,这个抽象类的构造函数有两个参数:level和bubble

level:表示该handler关心的最低日志级别,是个整型,

bubble:表示日志被当前handler处理后是否接着向下传递。

参照如下代码:

如上这段代码,这条日志被ErrorLogHandler处理了,并且ErrorLogHandler的bubble参数设置为false,则日志不会被写入my_app.log中了

二、formatter设置日志格式

每个handler可以单独设置记录的日志格式,AbstractHandler抽象类中有一个setFormatter方法,该参数接受一个FormatterInterface类型的参数。可以看到monolog自带的formatter都继承自NormalizerFormatter,该类实现了format和formatBatch方法。

我们修改上面的示例代码,让两个handler记录不同格式的日志:

此时可以看到my_app.log中记录的日志就变为了更方便解析的json格式了

三、processor 日志处理器,用来给日志添加额外信息

存放processor的结构也是一个“栈”,意味着你也可以通过pushProcessor方法给一个Logger实例配置多个processor

我们注意到,这里pushProcessor接受一个callable,也就是需要一个函数或者类方法,但是官方自带的这些processor都是类

随便点进去一个源码就会发现,其实这些类都用到了__invoke魔术方法,所以在被当做callable调用的时候会自动调用__invoke。

我们接着修改上面示例,给我们的日志加上更多信

再次执行这段代码就能看到,我们在日的后面加上了uid和process_id。

通过以上的介绍相信你对monolog的使用和库的整体架构都有一个比较系统的认识了,这个时候你应该能发现,自己开发一个handler、formatter、processor是如此简单,只用实现两个接口,再写一个匿名函数,就能完全控制自己的日志处理方式和日志格式了。

php 日志库,这可能是php世界中最好的日志库——monolog相关推荐

  1. 事物日志恢复 mysql_浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用...

    本篇文章是系列文章中的第五篇,是对前一个日志系列的补充篇.如果您对日志的基本概念还没有一个比较系统的了解,可以参看本系列之前的文章: 浅谈SQL Server中的事务日志(一)----事务日志的物理和 ...

  2. linux 查看系统函数库,教你在Linux操作系统中如何创建函数库

    函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存 ...

  3. linux审计日志都包含哪儿写,windows系统中的审计日志包括哪些

    满意答案 一.Windows日志系统 WindowsNT/2000的系统日志文件有应用程序日志AppEvent.Evt.安全日志SecEvent.Evt.系统日志SysEvent.Evt,根据系统开通 ...

  4. linux系统日志_第十二章:走进Linux世界——系统日志管理,日志轮转。

    1.关心问题:哪类程序---> 产生的什么日志----> 放到什么地方 2.处理日志的进程 (1) 第一类: rsyslogd: 系统专职日志程序. 处理绝大部分日志记录, 系统操作有关的 ...

  5. 探索java世界中的日志奥秘

    java日志简单介绍 对于一个应用程序来说日志记录是必不可少的一部分.线上问题追踪,基于日志的业务逻辑统计分析等都离不日志.JAVA领域存在多种日志框架,目前常用的日志框架包括Log4j,Log4j ...

  6. 1. 初识Jackson -- 世界上最好的JSON库

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...

  7. go语言 gin框架中集成zap日志库

    在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的.而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首 ...

  8. 在Go语言项目中使用Zap日志库

    在Go语言项目中使用Zap日志库 Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 一.在Go语言项目中使用 ...

  9. 组件库实战 | 教你如何设计Web世界中的表单验证

    教你如何设计Web世界中的表单验证

  10. 药品从药库到药房的流程注意事项----运维日志26

    药品从药库到药房的基本步骤 药库 建表出库→审核→入账 药房 入库审核→入账 注意: 1.提示没有药库管理权限,就在员工管理,角色管理中添加维护.要做好对应 2.药库和药房都要设置好对应部门,可在药房 ...

最新文章

  1. 果断收藏!一张版图带你摸清全球10大自动驾驶联盟布局
  2. 渗透知识-SQL注入
  3. oracle中database,Oracle Database 一些基本的视图和表
  4. 20220209-CTF-MISC-BUUCTF-修改图片宽高--ARCHPR工具的使用
  5. python的pygame库使用方法_[宜配屋]听图阁
  6. 吞噬星空怎么会有鸿蒙,论吞噬星空与鸿蒙的关系
  7. Mysql 中is null 和 =null 的区别
  8. Linux VFS的主要的数据结构
  9. numpy与matplotlib的学习报告
  10. python catia 接口_使用Python在CATIA中创建新产品
  11. po是什么意思java_PO/VO/DAO/BO/POJO是什么(JAVA 的解釋)
  12. Tomcat下载安装及配置Https教程
  13. 【初阶与进阶C++详解】第二十二篇:C++11新特性(列表初始化+变量类型推到+右值引用+新增默认成员函数+可变模板参数+lambda表达式+包装器function_bind)
  14. MBR生活污水处理设备常见参数的具体作用
  15. Bat_PNG转PDF,读取系统剪切板
  16. 排序算法之 插入排序、希尔(shell)排序 及其时间复杂度和空间复杂度
  17. 11075 强盗分赃
  18. 【Matlab图像去噪】改进非局部均值红外图像混合噪声【含源码 1640期】
  19. 周末去哪儿架构师跟你聊:大数据平台快速解决方案
  20. ST2Vec: Spatio-Temporal Trajectory Similarity Learning in Road Networks

热门文章

  1. 【VRP】基于matlab遗传算法求解出租车网约车接送客车辆路径规划问题【含Matlab源码 YC003期】
  2. 【三维路径规划】基于matlab Nsga-2算法求解无人机三维路径规划【含Matlab源码 1455期】
  3. 【语音处理】基于matlab GUI语音时域频域频谱图分析【含Matlab源码 527期】
  4. q-learning_教计算机如何通过Q-Learning玩Snake
  5. Mongodb新手看这一篇就够了
  6. grid函数--Matplotlib
  7. finalize()与PhantomReference学习笔记
  8. UVA1292-----Strategic game-----树形DP解决树上的最小点覆盖问题
  9. Zabbix篇四:钉钉机器人报警
  10. javaScript中的Object类型