php日志系统 seaslog1.6.2 安装配置使用及简单的封装

在php的网站下载了seaslog1.6.2
和安装其他扩展的方式一样

seaslog在Github上的描述

为什么使用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

那么有没有一种log类库满足以下需求呢:

分模块、分级别
配置简单(最好是勿须配置)
日志格式清晰易读
应用简单、性能很棒
SeasLog 正是应此需求而生。

Github上的中文文档
https://github.com/Neeke/SeasLog/blob/master/README_zh.md

安装:

# tar zxf SeasLog-1.6.2.tgz 
# cd SeasLog-1.6.2
#/usr/local/php/bin/phpize
#./configure --with-php-config=/usr/local/php/bin/php-config
#make && make install

然后去php.ini配置

; configuration for php SeasLog module
extension = seaslog.so
seaslog.default_basepath = /tmp/seaslog            ;默认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.trace_error = 1                                 ;自动记录错误 默认1(开启)
seaslog.trace_exception = 0                             ;自动记录异常信息 默认0(关闭)
seaslog.default_datetime_format = "Y:m:d H:i:s"         ;日期格式配置 默认"Y:m:d H:i:s"
seaslog.appender = 1                                    ;日志存储介质 1File 2TCP 3UDP (默认为1)
seaslog.remote_host = 127.0.0.1                         ;接收ip 默认127.0.0.1 (当使用TCP或UDP时必填)
seaslog.remote_port = 514                               ;接收端口 默认514 (当使用TCP或UDP时必填)

去写代码

SeasLog::setBasePath('/tmp/seaslog/code.zhangxingju.com');
$basePath_1=SeasLog::getBasePath();
echo  '当前的日志的路径设置为:'.$basePath_1.'
'; SeasLog::setLogger('seaslog/test'); $lastLogger_1 = SeasLog::getLastLogger(); echo '当前logger目录设置为:'.$lastLogger_1; SeasLog::info('this is a first info log');

访问页面,然后去看日志 成功

[root@localhost tmp]# cd /tmp/seaslog/
[root@localhost seaslog]# ls
code.zhangxingju.com  default
[root@localhost seaslog]# cd code.zhangxingju.com/
[root@localhost code.zhangxingju.com]# ls
seaslog
[root@localhost code.zhangxingju.com]# cd seaslog
[root@localhost seaslog]# ls
test
[root@localhost seaslog]# cd test
[root@localhost test]# ls
info.20160915.log
[root@localhost test]# cat info.20160915.log 
info | 33421 | 1473941737.538 | 2016:09:15 20:15:37 | this is a first info log 

查看日志的代码

$detailErrorArray_inAll   = SeasLog::analyzerDetail('info');
$detailErrorArray_today   = SeasLog::analyzerDetail('info',date('Ymd',time()));
var_dump($detailErrorArray_inAll,$detailErrorArray_today);

结果:

array(1) {
  [0]=>
  string(79) "info | 33421 | 1473941737.538 | 2016:09:15 20:15:37 | this is a first info log "
}
array(1) {
  [0]=>
  string(79) "info | 33421 | 1473941737.538 | 2016:09:15 20:15:37 | this is a first info log "
}

测试了,不会立即查询到刚插入的,估计因为脚本执行完才把日志从内存输入的缘故,用实际项目的时候根据需求重新封装下更灵活,要不编辑器都不提示,看着也不爽。
封装了了我想用到的简单的存日志功能,查看日志就直接看文件了

创建类Slog

/**
 * Created by zhangxingju.com.
 * User: aju
 * Date: 2016/9/15 0015
 * Time: 20:34
 * 封装的seaslog日志的简单存日志的类
 */
class SLog
{
    private $BasePath = "/tmp/seaslog/code.zhangxingju.com";   //项目里直接写死基本路径
    private $setLogger = 'seaslogtest';   //先设置了默认的日志路径
    private $elements = array();            //存入的元素

    /**
     * 保存日志
     * @param string $path
     */
    public function info($path = '')
    {
        SeasLog::setBasePath($this->BasePath);
        if (empty($path)) {
            SeasLog::setLogger($this->setLogger);
        } else {
            SeasLog::setLogger($path);
        }
        SeasLog::log('info', json_encode($this->elements));
    }

    /**
     * 增加存入的内容
     * @param $element
     * @return bool
     */
    public function add($element)
    {
        return (array_push($this->elements, $element)) ? true : false;
    }
}

使用

require_once 'SLog.php';
$Slog=new SLog();
//many code
$Slog->add('username is zhangxingju');
//many code
$Slog->add('password is 123');
//many code
$Slog->add('ip is 192.168.1.101');
//many code
$Slog->info('访问测试');

结果

[root@localhost code.zhangxingju.com]# ls
seaslog  访问测试
[root@localhost code.zhangxingju.com]# cd 访问测试/
[root@localhost 访问测试]# ls
info.20160915.log
[root@localhost 访问测试]# cat info.20160915.log 
info | 33422 | 1473945700.898 | 2016:09:15 21:21:40 | ["username is zhangxingju","password is 123","ip is 192.168.1.101"]