使用SeasLog打造PHP项目中的高性能日志组件(一)
云智慧(北京)科技有限公司 高驰涛
什么是SeasLog
SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便、规范、高效地写日志,以及快速地读取和查询日志。
为什么使用SeasLog
无论在什么应用中,log日志都是架构中不可缺少的一个重要组成部分,它通常是系统或软件、应用的运行记录。通过log的分析,可以方便用户了解系统或软件、应用的运行情况;如果你的应用log足够丰富,也可以分析以往用户的操作行为、类型喜好、地域分布或其他更多信息;如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状况,及时发现问题并快速定位、解决问题,补救损失。
我们知道,php内置了很多log函数,如error_log、syslog、file_put_content,这些函数功能强大且性能极好,但由于各种缺陷(error_log、file_put_content无错误级别、无固定格式像是信马由缰随处乱画;syslog不区分模块、而且与系统日志混合,读syslog记录会让人抓狂的。),灵活度降低了很多,很不能满足应用需求。基本上所有的开发者,都会自行设计封装log库,当然也会有很多开发者选择已有的开源日志库。
也有很多开源log类库弥补了上述缺陷,如log4php、plog、Analog等(当然也有很多应用在项目中自己开发的log类)。其中以log4php最为著名,它的设计精良、格式完美、文档完善、功能强大。但是经过测试,log4php的性能非常差。
这是log4php与SeasLog的性能对比图:

设计思路
那么有没有一种log类库同时满足以下需求呢:
·分模块、分级别
·配置简单(最好是勿须配置)
·日志格式清晰易读
·应用简单、性能很棒
我们知道,PSR-3标准是一个国际化的日志标准,它要求了“模块、级别、清晰、易用”等日志工作应具备的特点。因此,只要我们遵循了PSR-3标准,则我们可以完成“分模块、分级别”以及“日志格式清晰易读”的要求。
“配置简单”这个需求也很好完成。如果严格按照既定规则,其实只需要设置默认目录就可以了。
OK,现在我们只剩下“性能”这一个要求。
既然是日志,免不了会写文件,或者通过pipe通过网络传送到某个存储中心(我们暂不考虑存储中心的设计)。可以想见,假设一个请求中需要写出1000处log,那么势必会有1000次IO,这对性能将是一个很大的拖延点。一般对于处理这种多次相同的请求场景,我们要解决的其实也很简单,使用cache或buffer,把多次请求作归并,从而降低对磁盘或网络的IO,这是一个基本的思想。
SeasLog也是这么做的。设定一个buffer_size(默认100条log),使用PHP请求内存,每写一次log,塞入内存,同时buffer_size加;当buffer_size等于设置值时,则进行一次IO,同时清除buffer; 当然,如果请求结束了、或执行了die、exit或其他异常退出时,不管buffer_size有没有攒够设置值,立刻进行一次IO,同时清除buffer。
到目前为止,SeasLog的正式版本为1.1.6,采用Apache 2.0开源协议,同时可以在php.net官方,和Github库上获得它的完整代码。
Php.net http://pecl.php.net/package/seaslog
Github https://github.com/Neeke/SeasLog
目前提供了什么
·在PHP项目中便捷、规范地记录log
·可配置的默认log目录与模块
·指定log目录与获取当前配置
·初步的分析预警框架
·高效的日志缓冲、便捷的缓冲debug
·遵循 PSR-3 日志接口规范
怎么安装
获得源码后,可自行编译。
$ /path/to/phpize
$ ./configure --with-php-config=/path/to/php-config
$ make && make install
当然,使用PECL管理工具会更方便:
$ pecl install seaslog
seaslog.ini的配置
; configuration for php SeasLog module
extension = seaslog.so
seaslog.default_basepath = /log/seaslog-test ;默认log根目录
seaslog.default_logger = default ;默认logger目录
seaslog.disting_type = 1 ;是否以type分文件 1是 0否(默认)
seaslog.disting_by_hour = 1 ;是否每小时划分一个文件 1是 0否(默认)
seaslog.use_buffer = 1 ;是否启用buffer 1是 0否(默认)
seaslog.buffer_size = 100 ;buffer中缓冲数量 默认0(不使用buffer_size)
seaslog.level = 0 ;记录日志级别 默认0(所有日志)
seaslog.disting_type = 1 开启以type分文件,即log文件区分info\warn\erro
seaslog.disting_by_hour = 1 开启每小时划分一个文件
seaslog.use_buffer = 1 开启buffer。默认关闭。当开启此项时,日志预存于内存,当请求结束时(或异常退出时)一次写入文件。
seaslog.buffer_size = 100 设置缓冲数量为100. 默认为0,即无缓冲数量限制.当buffer_size大于0时,缓冲量达到该值则写一次文件.
seaslog.level = 3 记录的日志级别.默认为0,即所有日志均记录。当level为1时,关注debug以上级别(包括debug),以此类推。level大于8时,所有日志均不记录。
默认常量有哪些
遵循PSR-3标准,SeasLog 共将日志分成8个级别
·SEASLOG_DEBUG "debug"
·SEASLOG_INFO "info"
·SEASLOG_NOTICE "notice"
·SEASLOG_WARNING "warning"
·SEASLOG_ERROR "error"
·SEASLOG_CRITICAL "critical"
·SEASLOG_ALERT "alert"
·SEASLOG_EMERGENCY "emergency"
关于作者:
高驰涛(Neeke),云智慧高级架构师,PHP开发组成员,同时也是PECL/SeasLog等多个开源软件作者与贡献者。8年研发管理经验,早期从事大规模企业信息化研发架构,09年涉足互联网数字营销领域并深入研究架构与性能优化。对高并发、高性能、高可用系统设计实现有丰富经验。崇尚规范、敏捷、高效、GettingReal。目前在云智慧致力于APM产品的架构与研发。主要负责PHP、Python、Go等语言的底层扩展与SmartAgent的架构研发。
使用SeasLog打造PHP项目中的高性能日志组件(一)的更多相关文章
- 在WEB项目中调用QQ通讯组件打开QQ聊天界面
在很多WEB项目中,需要提供在线服务的功能,加上自己的联系方式,例如:QQ,不用添加QQ好友也可以交谈,那这到底是怎么实现的呢? 对于这个功能,需要提到一个组件,即“QQ通讯组件”.QQ通讯组件是一种 ...
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...
- [.Net Core] 在 Mvc 中简单使用日志组件
在 Mvc 中简单使用日志组件 基于 .Net Core 2.0,本文只是蜻蜓点水,并非深入浅出. 目录 使用内置的日志组件 简单过渡到第三方组件 - NLog 使用内置的日志 下面使用控制器 Hom ...
- 【PHP调试篇】PHP高性能日志组件SeasLog
简述 什么是SeasLog SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便.规范.高效地写日志,以及快速地读取和查询日志. 为什么使用SeasLog 无论在 ...
- Tomcat日志、项目中的log4j日志、e.printStackTrace()——我的日志最后到底跑哪去了?
1.Tomcat自带日志功能,即时你的项目中有log4j也不会影响到Tomcat自己记录日志. 2.你的项目中的log4j中的日志指定打印到什么地方(控制台或者文件),便会打印到什么地方,和Tomat ...
- Tomcat日志、项目中的log4j日志、控制台——我的日志最后到底跑哪去了?
1.Tomcat自带日志功能,即时你的项目中有log4j也不会影响到Tomcat自己记录日志. 2.你的项目中的log4j中的日志指定打印到什么地方(控制台或者文件),便会打印到什么地方,和Tomat ...
- web项目中添加logger日志
在项目中添加log4j.xml文件 log4j.xml文件 <?xml version="1.0" encoding="UTF-8" ?><! ...
- Go语言项目中使用zap日志库(翻译)
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...
- C#轻量级高性能日志组件EasyLogger
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第六部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
随机推荐
- [源码]DataIOStream 数据流 处理基本数据类型的流
纵骑横飞 章仕烜 首先我们来看一下 DataOutputStream /** * A data output stream lets an application write primit ...
- Repeater控件使用中的一些小问题
网页上用来展示列表的数据,发现还是Repeater比GridView,DetailView之类的要灵活些,所以近期用到了就总结下遇到的一些情况,保留下来以备之后查阅,不用现问度娘了... 自己摸索的, ...
- 仿造w3school的试一试功能,实现左侧编辑框,右侧效果页面
转自http://fhqllt.iteye.com/blog/836186 每次想快速测试页面效果的时候,特别是在学习前端代码的时候,就想到W3school的那个试一试功能,一直都是用他们那个在线的版 ...
- 配置grunt进行css、js的检查、合并和压缩
现在会进行代码的合并和压缩已成为前端人员的必备知识,那么现在来介绍一个grunt的工具.grunt是个风靡世界的工具,它的首页是 http://www.gruntjs.net 这是个中文网站,有文档 ...
- Android jar包的导出和使用
一.工程打成JAR包. 1. eclipse下有一工程JsnTxJar,右键工程名选择Export. 选择Java->JAR file 下图所示左边一栏只勾选src,右边一栏都不用勾 ...
- 【转】日期工具类DateUtils
转自csdn,原作者:jzhf2012 package date.util; import java.text.ParseException; import java.text.SimpleDateF ...
- Linux 任务计划
一.配置cron实现自动化 使用cron实现任务自动化可以通过修改/etc/crontab文件以及使用crontab命令实现,其结果是一样的. 1./etc/crontab文件实现自动化 cron守护 ...
- TableViewCell,TableView,UITableViewCell
这次的学习是在Navigation-based Application模板中,用RootViewController class设置操作方法,使用UITableView的属性值.在导航控制器控件为程序 ...
- [转]:Delphi 中的哈希表(1): THashedStringList
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 自动检测浏览器是手机还是pc
function CheckBrower() { if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { //判断iPhone|iPad| ...