zoukankan      html  css  js  c++  java
  • SeasLog 与 monolog 日志系统的区别,SeasLog安装步骤

    SeasLog 是用 C 语言编写的 PHP 扩展库,功能强大而且性能极高 monolog 比这个差远了。

    普通的日志组件

    假设一个接口里,里写了 5 次记录日志,

    对于 monolog 而言是 5 次写磁盘操作,也就是 5 次 IO,

    在高并发场下,日志写入到磁盘中,

    机器的磁盘 IO , 网络 IO, 内存操作 都会对 CPU 的负载造成压力.

    频繁的刷磁盘,CPU 会因为日志写入导致占用率过高,
    因为接口本身的逻辑 1. 读写 Mysql 2. 读写 Redis 3. 队列任务
    本身就已经有了不少的网络 IO 和磁盘 IO 操作了.

    那,seasLog 是怎么做的呢?
    具体如下
    你可以在配置文件中自定义 每 N 次 日志数据写入到磁盘一次
    在写入磁盘之前先存储在 buffer 中,也就是内存中
    对于上面的场景 相当于 5 次磁盘 IO 变成了一次磁盘 IO

    1. 高并发下日志不会成为性能瓶颈 秒 QPS 8000

    2. 自带日志分析预警框架 (默认关闭)(主要用来分析 Error 日志)
    A: 统计某种日志级别的数量
    B: 查看某种日志级别的所有日志 C: 通过邮件方式发出日志报警

    3. 支持每 log N 次后,日志数据写入磁盘 (日志缓冲区)

    4. 支持 RequestId 请求全局 id 区分请求

    5. 支持按照时间切割日志

    我是 seaslog 的受益者,

    使用这个组件后,解决了我司的日志对 CPU 占用问题.

    还有链路追踪问题,得益于 (全局的 RequestId)

    这个好东西,分享给你. 

    亲测安装步骤:

    1.下载安装包:

    sudo wget https://pecl.php.net/get/SeasLog-2.2.0.tgz

    解压

    sudo tar xzvf SeasLog-2.2.0.tgz 

    2.运行phpize,生成configure 编译文件

    3 . 配置

    sudo ./configure --with-php-config=/usr/local/php/bin/php-config

    4.编译并安装

    sudo make && make install

    扩展存放在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/  目录下

    5.在php.ini 文件中添加seaslog 扩展

    extension=seaslog.so
    
    [SeasLog]
    seaslog.default_basepath ="/tmp"
    seaslog.default_logger = "default"
    seaslog.disting_type = 1
    seaslog.disting_by_hour = 1
    seaslog.use_buffer = 1
    seaslog.buffer_size = 100
    seaslog.level = 8
    seaslog.trace_error = 1
    seaslog.trace_exception = 0

    6.重启PHP

     sudo service php-fpm reload

    7.运行结果

    <?php
    
    SeasLog::setBasePath('/home/wwwlogs/seaslog');
    //echo SeasLog::getBasePath();
    
    SeasLog::setLogger('api');
    echo SeasLog::getBasePath();
    echo '<br>'.SeasLog::getLastLogger();
    
    SeasLog::debug('test');
    SeasLog::debug('this is a debug');
    SeasLog::info('this is a info');
    SeasLog::notice('this is a notice');
    SeasLog::emergency('this is a emergency');
    
    $data=SeasLog::analyzerCount();
    echo '<pre>';
    print_r($data);
    echo '<pre>';
    
    SeasLog::flushBuffer();
    //SeasLog::log('info','this is info test');
    
    echo phpinfo();

    常见问题:

    1.seaslog.level = 8 记录所有日志类型 ,慕课网中给出的seaslog.level = 0 记录所有日志,正好相反,这是一个坑

    ;记录日志级别,数字越大,根据级别记的日志越多。
    ;0-EMERGENCY 1-ALERT 2-CRITICAL 3-ERROR 4-WARNING 5-NOTICE 6-INFO 7-DEBUG 8-ALL
    ;默认8(所有日志)
    ;
    ;   注意, 该配置项自1.7.0版本开始有变动。
    ;   在1.7.0版本之前, 该值数字越小,根据级别记的日志越多: 
    ;   0-all 1-debug 2-info 3-notice 4-warning 5-error 6-critical 7-alert 8-emergency
    ;   1.7.0 之前的版本,该值默认为0(所有日志);
    seaslog.level = 8

    seaslog.level = 8 Default logger level.The Default value was 8, it’s meaning SeasLog will record all of the level.  默认记录器水平仪默认值是8,这意味着SeasLog将记录所有级别。

    seaslog.level = 0 SeasLog will record which level EMERGENCY.

    seaslog.level = 1 SeasLog will record which level EMERGENCY,ALERT.

    seaslog.level = 2 SeasLog will record which level EMERGENCY,ALERT,CRITICAL.

    seaslog.level = 3 SeasLog will record which level EMERGENCY,ALERT,CRITICAL,ERROR.

    seaslog.level = 4 SeasLog will record which level EMERGENCY,ALERT,CRITICAL,ERROR,WARNING.

    seaslog.level = 5 SeasLog will record which level EMERGENCY,ALERT,CRITICAL,ERROR,WARNING,NOTICE.

    seaslog.level = 6 SeasLog will record which level EMERGENCY,ALERT,CRITICAL,ERROR,WARNING,NOTICE,INFO.

    seaslog.level = 7 SeasLog will record which level EMERGENCY,ALERT,CRITICAL,ERROR,WARNING,NOTICE,INFO,DEBUG.

    2.4.2日志模板说明

    模板默认为:seaslog.default_template = "%T | %L | %P | %Q | %t | %M"

    默认的格式为{dateTime} | {level} | {pid} | {uniqid} | {timeStamp} | {logInfo}

    真实案例:2020-05-09 10:31:58 | DEBUG | 10012 | 5eb6161dd598e | 1588991518.904 | debug日志

    如果自定义模板为:seaslog.default_template = "[%T]:%L %P %Q %t %M"

    自定义日志格式为:[{dateTime}]:{level} {pid} {uniqid} {timeStamp} {logInfo}

    真实案例:[2020-05-09 10:31:58] :{DEBUG} {10012} {5eb6161dd598e} {1588991518.904}{debug日志}

    PS:%L 必须在%M之前,就是说日志级别在日志内容之前。

    3.seaslog的常用方法

    配置方法:setBasePath,getBasePath,setLogger,getLastLogger

    写日志方法:log,info,notice,debug,warning,error

    读日志方法:analyzerCount,analyzerDetail

    3.1 常量列表

    SeasLog 共将日志分成8个级别

    级别

    简写

    备注

    SEASLOG_DEBUG

    DEBUG

    debug信息、细粒度信息事件

    SEASLOG_INFO

    INFO

    重要事件、强调应用程序的运行过程

    SEASLOG_NOTICE

    NOTICE

    一般重要性事件、执行过程中较INFO级别更为重要的信息

    SEASLOG_WARNING

    WARNING

    出现了非错误性的异常信息、潜在异常信息、需要关注并且需要修复

    SEASLOG_ERROR

    ERROR

    运行时出现的错误、不必要立即进行修复、不影响整个逻辑的运行、需要记录并做检测

    SEASLOG_CRITICAL

    CRITICAL

    紧急情况、需要立刻进行修复、程序组件不可用

    SEASLOG_ALERT

    ALERT

    必级立即采取行动的紧急事件、需要立即通知相关人员紧急修复

    SEASLOG_EMERGENCY

    EMERGENCY

    系统不可用

    3.2:SeasLog的性能究竟怎么样

    A:

    当SeasLog不开启buffer时,SeasLog是:syslog()函数的8.6倍、file_put_contents()函数的240倍、fwrite()单例情况下的36倍、fwrite()非单例情况下的211倍、monolog不开启buffer时的41倍;当SeasLog开启buffer且buffer_size为100时,SeasLog是:syslog()函数的250倍、file_put_contents()函数的6962倍、fwrite()单例情况下的1052倍、fwrite()非单例情况下的6127倍、monolog开启buffer且buffer size为100时的118倍。

    官方文档:https://github.com/Neeke/SeasLog/blob/master/README_zh.md

    https://my.oschina.net/mtdg/blog/4273817

    赞赏码

    非学,无以致疑;非问,无以广识

  • 相关阅读:
    阿里P8架构师谈:阿里双11秒杀系统如何设计?
    秒杀系统设计的知识点
    秒杀系统架构优化思路
    秒杀系统解决方案
    Entity Framework Code First (七)空间数据类型 Spatial Data Types
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452590.html
Copyright © 2011-2022 走看看