### 简介
#### 什么是SeasLog
SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便、规范、高效地写日志,以及快速地读取和查询日志。
#### 为什么使用SeasLog
log日志,通常是系统或软件、应用的运行记录。通过log的分析,可以方便用户了解系统或软件、应用的运行情况;如果你的应用log足够丰富,也可以分析以往用户的操作行为、类型喜好、地域分布或其他更多信息;如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状况,及时发现问题并快速定位、解决问题,补救损失。
php内置error_log、syslog函数功能强大且性能极好,但由于各种缺陷(error_log无错误级别、无固定格式,syslog不分模块、与系统日志混合),灵活度降低了很多,不能满足应用需求。
好消息是,有不少第三方的log类库弥补了上述缺陷,如log4php、plog、Analog等(当然也有很多应用在项目中自己开发的log类)。其中以log4php最为著名,设计精良、格式完美、文档完善、功能强大。推荐。
不过log4php在性能方面表现非常差,下图是SeasLog与log4php的ab并发性能测试( 测试环境:Ubuntu12.04单机,CPU I3,内存 16G,硬盘 SATA 7200): SeasLogVSlog4php
![](https://box.kancloud.cn/86c4f102af29132eb568ca6e08cff206_791x372.png)
那么有没有一种log类库满足以下需求呢:
* 分模块、分级别
* 配置简单(最好是勿须配置)
* 日志格式清晰易读
* 应用简单、性能很棒
SeasLog 正是应此需求而生。
目前提供了什么
1. 在PHP项目中便捷、规范地记录log
2. 可配置的默认log目录与模块
3. 指定log目录与获取当前配置
4. 初步的分析预警框架
5. 高效的日志缓冲、便捷的缓冲debug
6. 遵循 PSR-3 日志接口规范
7. 自动记录错误信息
8. 自动记录异常信息
9. 连接TCP端口,以RFC5424格式发送日志
10. 连接UDP端口,以RFC5424格式发送日志
11. 支持RequestId区分请求
12. 支持日志模板自定义
目标是怎样的
* 便捷、规范的log记录
* 高效的海量log分析
* 可配置、多途径的log预警
#### 性能要求
既然是日志,免不了会写文件,或者通过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的正式版本,采用Apache 2.0开源协议,同时可以在php.net官方,和Github库上获得它的完整代码。
[Php.net](http://pecl.php.net/package/seaslog)
[Github](https://github.com/Neeke/SeasLog)