zoukankan      html  css  js  c++  java
  • PHP日志扩展 SeasLog-1.6.8, 性能更优

    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文件区分infowarnerro


    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 " ";
  • 相关阅读:
    iOS MVC <模型-视图-控制器>
    iOS interface building 大纲视图内容
    循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理 (转载)
    循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储(转载)
    ABP框架中一对多,多对多关系的处理以及功能界面的处理(2)(转载)
    ABP框架中一对多,多对多关系的处理以及功能界面的处理(1)(转载)
    电商商品数据库的设计和功能界面的处理 (转载)
    循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)(转载)
    循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)(转载)
    循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理(转载)
  • 原文地址:https://www.cnblogs.com/oceansea/p/5974020.html
Copyright © 2011-2022 走看看