SeasLog-1.6.8 发布了,性能更优。

改进日志:

1.6.8: 优化内存使用和性能,修复已知Bug.

- Fixed issue #97 PHP5.* Cached Block.

- Fixed issue #98 SeasLog::analyzerDetail(NULL).

- Fixed issue #100 #102 #103 memory leak.

- Fixed Dir chmod 0755 and File chmod 0666.

1.6.0:此次改进支持appender配置,同时支持File,TCP,UDP三种发送方式。

- Fixed issue #90 #92 Date format.

- Fixed issue #96 Clear memory leaks.

- Fixed issue #91 Support TCP UDP appender.

- Support appender with config, switch File TCP UDP; config the remote_host and remote_port.

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

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

  • 分模块、分级别

  • 配置简单(最好是勿须配置)

  • 日志格式清晰易读

  • 应用简单、性能很棒

SeasLog 正是应此需求而生。

目前提供了什么

  • 在PHP项目中便捷、规范地记录log

  • 可配置的默认log目录与模块

  • 指定log目录与获取当前配置

  • 初步的分析预警框架

  • 高效的日志缓冲、便捷的缓冲debug

  • 遵循 PSR-3 日志接口规范

  • 自动记录错误信息

  • 自动记录异常信息

  • 支持TCP发送

  • 支持UDP发立大

目标是怎样的

  • 便捷、规范的log记录

  • 高效的海量log分析

  • 可配置、多途径的log预警

安装

编译安装 SeasLog

?
1
2
3
/path/to/phpize
$ ./configure --with-php-config=/path/to/php-config
make && make install

PECL安装SeasLog

?
1
$ pecl install seaslog

seaslog.ini 的配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; 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.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.disting_type = 1 开启以type分文件,即log文件区分info\warn\erro

seaslog.disting_by_hour = 1 开启每小时划分一个文件

seaslog.use_buffer = 1 开启buffer。默认关闭。当开启此项时,日志预存于内存,当请求结束时(或异常退出时)一次写入文件。

常量与函数

常量列表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
* SEASLOG_DEBUG                       "debug"
* SEASLOG_INFO                        "info"
* SEASLOG_NOTICE                      "notice"
* SEASLOG_WARNING                     "warning"
* SEASLOG_ERROR                       "error"
* SEASLOG_CRITICAL                    "critical"
* SEASLOG_ALERT                       "alert"
* SEASLOG_EMERGENCY                   "emergency"
 
 
var_dump(SEASLOG_DEBUG,SEASLOG_INFO,SEASLOG_NOTICE);
/*
string('debug') debug级别
string('info')  info级别
string('notice') notice级别
*/

函数列表

SeasLog 提供了这样一组函数,可以方便地获取与设置根目录、模块目录、快速写入与统计log。 相信从下述伪代码的注释中,您可以快速获取函数信息,具体使用将紧接其后:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
<?php
/**
 * @author neeke@php.net
 * Date: 14-1-27 下午4:47
 */
 
class SeasLog
{
    public function __construct()
    {
        #SeasLog init
    }
 
    public function __destruct()
    {
        #SeasLog distroy
    }
 
    /**
     * 设置basePath
     *
     * @param $basePath
     *
     * @return bool
     */
    static public function setBasePath($basePath)
    {
        return TRUE;
    }
 
    /**
     * 获取basePath
     *
     * @return string
     */
    static public function getBasePath()
    {
        return 'the base_path';
    }
 
    /**
     * 设置模块目录
     * @param $module
     *
     * @return bool
     */
    static public function setLogger($module)
    {
        return TRUE;
    }
 
    /**
     * 获取最后一次设置的模块目录
     * @return string
     */
    static public function getLastLogger()
    {
        return 'the lastLogger';
    }
 
    /**
     * 设置DatetimeFormat配置
     * @param $format
     *
     * @return bool
     */
    static public function setDatetimeFormat($format)
    {
        return TRUE;
    }
 
    /**
     * 返回当前DatetimeFormat配置格式
     * @return string
     */
    static public function getDatetimeFormat()
    {
        return 'the datetimeFormat';
    }
 
    /**
     * 统计所有类型(或单个类型)行数
     * @param string $level
     * @param string $log_path
     * @param null   $key_word
     *
     * @return array | long
     */
    static public function analyzerCount($level 'all'$log_path '*'$key_word = NULL)
    {
        return array();
    }
 
    /**
     * 以数组形式,快速取出某类型log的各行详情
     *
     * @param        $level
     * @param string $log_path
     * @param null   $key_word
     * @param int    $start
     * @param int    $limit
     * @param        $order
     *
     * @return array
     */
    static public function analyzerDetail($level = SEASLOG_INFO, $log_path '*'$key_word = NULL, $start = 1, $limit = 20, $order = SEASLOG_DETIAL_ORDER_ASC)
    {
        return array();
    }
 
    /**
     * 获得当前日志buffer中的内容
     *
     * @return array
     */
    static public function getBuffer()
    {
        return array();
    }
 
    /**
     * 将buffer中的日志立刻刷到硬盘
     *
     * @return bool
     */
    static public function flushBuffer()
    {
        return TRUE;
    }
 
    /**
     * 记录debug日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function debug($messagearray $content array(), $module '')
    {
        #$level = SEASLOG_DEBUG
    }
 
    /**
     * 记录info日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function info($messagearray $content array(), $module '')
    {
        #$level = SEASLOG_INFO
    }
 
    /**
     * 记录notice日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function notice($messagearray $content array(), $module '')
    {
        #$level = SEASLOG_NOTICE
    }
 
    /**
     * 记录warning日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function warning($messagearray $content array(), $module '')
    {
        #$level = SEASLOG_WARNING
    }
 
    /**
     * 记录error日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function error($messagearray $content array(), $module '')
    {
        #$level = SEASLOG_ERROR
    }
 
    /**
     * 记录critical日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function critical($messagearray $content array(), $module '')
    {
        #$level = SEASLOG_CRITICAL
    }
 
    /**
     * 记录alert日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function alert($messagearray $content array(), $module '')
    {
        #$level = SEASLOG_ALERT
    }
 
    /**
     * 记录emergency日志
     *
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function emergency($messagearray $content array(), $module '')
    {
        #$level = SEASLOG_EMERGENCY
    }
 
    /**
     * 通用日志方法
     * @param        $level
     * @param        $message
     * @param array  $content
     * @param string $module
     */
    static public function log($level$messagearray $content array(), $module '')
    {
 
    }
}

SeasLog Logger的使用(详细文档)

使用SeasLog进行健康预警 悦德财富:https://www.yuedecaifu.com

预警的配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[base]
wait_analyz_log_path = /log/base_test
 
 
[fork]
;是否开启多线程 1开启 0关闭
fork_open = 1
 
 
;线程个数
fork_count = 3
 
 
[warning]
email[smtp_host] = smtp.163.com
email[smtp_port] = 25
email[subject_pre] = 预警邮件 -
email[smtp_user] = seaslogdemo@163.com
email[smtp_pwd] = seaslog#demo
email[mail_from] = seaslogdemo@163.com
email[mail_to] = gaochitao@weiboyi.com
email[mail_cc] = ciogao@gmail.com
email[mail_bcc] =
 
 
[analyz]
; enum
; SEASLOG_DEBUG      "debug"
; SEASLOG_INFO       "info"
; SEASLOG_NOTICE     "notice"
; SEASLOG_WARNING    "warning"
; SEASLOG_ERROR      "error"
; SEASLOG_CRITICAL   "critical"
; SEASLOG_ALERT      "alert"
; SEASLOG_EMERGENCY  "emergency"
 
 
test1[module] = test/bb
test1[level] = SEASLOG_ERROR
test1[bar] = 1
test1[mail_to] = gaochitao@weiboyi.com
 
 
test2[module] = 222
test2[level] = SEASLOG_WARNING
 
 
test3[module] = 333
test3[level] = SEASLOG_CRITICAL
 
 
test4[module] = 444
test4[level] = SEASLOG_EMERGENCY
 
 
test5[module] = 555
test5[level] = SEASLOG_DEBUG

crontab配置

?
1
2
;每天凌晨3点执行
0 3 * * * /path/to/php /path/to/SeasLog/Analyzer/SeasLogAnalyzer.php

Demo:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
 * @author ciogao@gmail.com
 * Date: 14-1-27 下午4:41
 */  
 
SeasLog::log(SEASLOG_ERROR,'this is a error test by ::log');
 
SeasLog::debug('this is a {userName} debug',array('{userName}' => 'neeke'));
 
SeasLog::info('this is a info log');
 
SeasLog::notice('this is a notice log');
 
SeasLog::warning('your {website} was down,please {action} it ASAP!',array('{website}' => 'github.com','{action}' => 'rboot'));
 
SeasLog::error('a error log');
 
SeasLog::critical('some thing was critical');
 
SeasLog::alert('yes this is a {messageName}',array('{messageName}' => 'alertMSG'));
 
SeasLog::emergency('Just now, the house next door was completely burnt out! {note}',array('{note}' => 'it`s a joke'));
echo "\n";

PHP日志扩展 SeasLog-1.6.8, 性能更优的更多相关文章

  1. Mongodb性能调优

    摘要 1. Mongodb 适用场景简介 2. Mongodb 性能监控与分析 3. Mongodb 性能优化建议 关于Mongodb的几个大事件 1.根据美国数据库知识大全官网发布的DB热度排行,M ...

  2. 学习了解PHP中的SeasLog日志扩展

    今天来学习的扩展是和日志相关的一个扩展,对于 PHP 的日志应用来说,除了本身自带的 error_log() . syslog() 之外,在大多数的框架中还会经常见到 monolog 的踪影.当然,我 ...

  3. PHP扩展高性能日志系统SeasLog简单上手

    Windows部分:-------------------------------------------------------- https://pecl.php.net/package/Seas ...

  4. 高性能PHP日志插件--Seaslog

    日志系统作为记录系统运行的信息,包括 用户输入,安全日志等,日志系统是不能影响用户的使用. 为什么需要记录日志? 既然日志系统增加了整个系统的开销,为什么我还需要它,这是因为日志能帮我们记录运行的很多 ...

  5. php扩展SeasLog应用于 yii2 组件

    一.seaslog 简单介绍及使用原因 它是C 写的PHP扩展,性能很高,使用简单,能满足大部分简单的日志需求.(个人感觉) 其他优势请看-->https://github.com/Neeke/ ...

  6. MySQL性能调优与架构设计——第12章 可扩展设计的基本原则

    第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体 ...

  7. php 日志扩展

    今天发现一个比较好的php应用日志扩展,这里先mark一下,回头有空再详细介绍: http://neeke.github.io/SeasLog/

  8. php 之 日志系统seaslog安装

    php 之 日志系统seaslog 特点: 1.高性能(使用C语言编写的). 2.无需配置. 3.功能完善.使用简单. 安装: 打开php的扩展官网:https://pecl.php.net/. 然后 ...

  9. tomcat accesslog日志扩展

    由于工作需要,最近对tomcat的日志进行了一些研究,发现其日志大致可以分为两类,一类是运行日志,即平常我们所说的catalina.out日志,由tomcat内部代码调用logger打印出来的:另一类 ...

随机推荐

  1. 完整成功配置wamp server小记

    首先安装最新版本的wamp server,这是必须的! 配置默认”www目录”的路径(可选):下面以改为D:\site为例.打开wamp\scripts\config.inc.php第47行,$www ...

  2. dynamics_cast<>

    #include <iostream> class A { public: A(){} ~A(){} ;} }; class B:public A { public: B(){} ~B() ...

  3. Java虚拟机学习(4):对象内存分配与回收

    对象优先在Eden上分配 大多数情况下,对象优先在新生代Eden区域中分配.当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC).Minor GC期间虚拟机将E ...

  4. 关于一个新的DOM选择器querySelector

    在传统的javascript中,提到DOM选择器,大家比较熟悉的方式是通过tag,name,id来获取,其实大家都发现如果获取比较复杂的话,用这个方法会很繁琐,这时大家应该都会想到jquery里获取一 ...

  5. 关于JQ的$.deferred函数。参考网络文档

    由于jQuery版本问题对Deferred对象的实现有所不同,具体请参照jQuery api:   jQuery.Deferred()基于Promises/A规范实现,因为jQuery本身的设计风格, ...

  6. 获取gridpanel 中 checkbox的状态

    最近一直在用extjs前天框架来写作项目,很少用到这个框架,过程中遇到很多麻烦, 可能就是一个小的问题会困扰你很长时间, example: 我做一个报表,要获取gridpanel中 checkbox的 ...

  7. SOAP和WSDL的一些必要知识

    SOAP和WSDL对Web Service.WCF进行深入了解的基础,因此花一些时间去了解一下是很有必要的. 一.SOAP(Simple Object Access Protocol) 如果我们要调用 ...

  8. Eclipse默认标签TODO,XXX,FIXME和自定义标签[转]

    http://www.blogjava.net/Guides/archive/2011/11/14/363686.html   Eclipse中的一些特殊的注释技术包括:    1.    // TO ...

  9. sql函数PadLeft与PadRight代码实例

    1.PadLeft函数向已知字符串左边补充字符,使整个字符串到达指定长度 CREATE FUNCTION PadLeft ( ),/*原始字符*/ @TotalLength int,/*总长度*/ ) ...

  10. 20161106PM-Fiddler

    1. 设置Fidder使之支持HTTPS协议 Tools->Fiddler Options->HTTPS->勾上Decrypt HTTPS traffic->OK 2. 断点 ...