PHP日誌擴展 SeasLog-1.4.2 發布,支持錯誤與異常

2020-12-12 開源中國

SeasLog-1.4.2 發布!

SeasLog是一個輕量,高效,便捷,規範的PHP日誌擴展,精準的定位\精巧的設計,使它在PHP項目中逐步成為一個非常優秀的日誌工具.

Change log:

1.2.2

- Fixed Logger bug with PHP-Version -ge 5.4
- Fixed SeasLog::log('level','message','content',['logger']) bug
- Support SeasLog::analyzerDetail("all")
- Support SeasLog::analyzerCount("all")

1.2.3

- Fixed issue #44 Seaslog::analyzerDetail([with out 'all'])
- Support CONST SEASLOG_ALL

1.4.0

- Fixed issue #42 support error and exception automatic logging.
- Optimization performance, update is_dir with access.

1.4.2

- Fixed issue #47 support trace_error and trace_exception switch.
- Fixed issue #48 Ignore notice or warning, but error automatic logging.


附1:PECL項目主頁http://pecl.php.net/package/SeasLog

附2:GitHub項目主頁https://github.com/Neeke/SeasLog


SeasLog
Yet a log extension for PHP.A effective,fast,stable log extension for PHP
@author Chitao.Gao [neeke@php.net]

為什麼使用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 日誌接口規範

目標是怎樣的

  • 便捷、規範的log記錄

  • 高效的海量log分析

  • 可配置、多途徑的log預警

安裝

編譯安裝 seaslog

$ /path/to/phpize$ ./configure --with-php-config=/path/to/php-config$ make && make install

seaslog.ini的配置


; configuration for php SeasLog moduleextension = seaslog.soseaslog.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 = 0                         ;自動記錄錯誤 默認0(關閉)seaslog.trace_exception = 1                     ;自動記錄異常信息 默認1(開啟)


seaslog.disting_type = 1 開啟以type分文件,即log文件區分info\warn\erro

seaslog.disting_by_hour = 1 開啟每小時劃分一個文件

seaslog.use_buffer = 1 開啟buffer。默認關閉。當開啟此項時,日誌預存於內存,當請求結束時(或異常退出時)一次寫入文件。

常量與函數

常量列表

* 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。 相信從下述偽代碼的注釋中,您可以快速獲取函數信息,具體使用將緊接其後:

<?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';    }    /**     * 統計所有類型(或單個類型)行數     * @param $level     * @param string $log_path     * @return array | long     */    static public function analyzerCount($level = 'all',$log_path = '*')    {        return array();    }    /**     * 以數組形式,快速取出某類型log的各行詳情     * @param $level     * @param string $log_path     * @return array     */    static public function analyzerDetail($level = SEASLOG_INFO,$log_path = '*')    {        return array();    }    /**     * 獲得當前日誌buffer中的內容     * @return array     */    static public function getBuffer()    {        return array();    }    /**     * 記錄debug日誌     * @param $message     * @param array $content     * @param string $module     */    static public function debug($message,array $content = array(),$module = '')    {        #$level = SEASLOG_DEBUG    }    /**     * 記錄info日誌     * @param $message     * @param array $content     * @param string $module     */    static public function info($message,array $content = array(),$module = '')    {        #$level = SEASLOG_INFO    }    /**     * 記錄notice日誌     * @param $message     * @param array $content     * @param string $module     */    static public function notice($message,array $content = array(),$module = '')    {        #$level = SEASLOG_NOTICE    }    /**     * 記錄warning日誌     * @param $message     * @param array $content     * @param string $module     */    static public function warning($message,array $content = array(),$module = '')    {        #$level = SEASLOG_WARNING    }    /**     * 記錄error日誌     * @param $message     * @param array $content     * @param string $module     */    static public function error($message,array $content = array(),$module = '')    {        #$level = SEASLOG_ERROR    }    /**     * 記錄critical日誌     * @param $message     * @param array $content     * @param string $module     */    static public function critical($message,array $content = array(),$module = '')    {        #$level = SEASLOG_CRITICAL    }    /**     * 記錄alert日誌     * @param $message     * @param array $content     * @param string $module     */    static public function alert($message,array $content = array(),$module = '')    {        #$level = SEASLOG_ALERT    }    /**     * 記錄emergency日誌     * @param $message     * @param array $content     * @param string $module     */    static public function emergency($message,array $content = array(),$module = '')    {        #$level = SEASLOG_EMERGENCY    }    /**     * 通用日誌方法     * @param $level     * @param $message     * @param array $content     * @param string $module     */    static public function log($level,$message,array $content = array(),$module = '')    {    }}

SeasLog Logger的使用(詳細文檔)

使用SeasLog進行健康預警

預警的配置

[base]wait_analyz_log_path = /log/base_test[fork];是否開啟多線程 1開啟 0關閉fork_open = 1;線程個數fork_count = 3[warning]email[smtp_host] = smtp.163.comemail[smtp_port] = 25email[subject_pre] = 預警郵件 -email[smtp_user] = seaslogdemo@163.comemail[smtp_pwd] = seaslog#demoemail[mail_from] = seaslogdemo@163.comemail[mail_to] = gaochitao@weiboyi.comemail[mail_cc] = ciogao@gmail.comemail[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/bbtest1[level] = SEASLOG_ERRORtest1[bar] = 1test1[mail_to] = gaochitao@weiboyi.comtest2[module] = 222test2[level] = SEASLOG_WARNINGtest3[module] = 333test3[level] = SEASLOG_CRITICALtest4[module] = 444test4[level] = SEASLOG_EMERGENCYtest5[module] = 555test5[level] = SEASLOG_DEBUG


crontab配置

;每天凌晨3點執行0 3 * * * /path/to/php /path/to/SeasLog/Analyzer/SeasLogAnalyzer.php


Demo:

<?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";


相關焦點

  • 基於SeasLog 的 composer 項目 SeasLogger 0.1.2 發布
    SeasLogger —— 一個基於 SeasLog 的、有效、快速、穩定的 PHP 日誌工具
  • PHP 7.4.0 發布 支持類型聲明
    PHP 7.4.0 發布了,此版本標誌著 PHP 7 系列的第四次特性更新。PHP 7.4.0 進行了許多改進,並帶來了一些新特性,包括:Typed Properties  類型屬性類屬性現在支持類型聲明,以下示例將強制 $User-> id 只能分配 int 值,而 $User-> name 只能分配 string 值。
  • PHP 中的錯誤和異常處理
    就我自己這些年寫程序的現狀看,我基本上就沒有真正明白什麼是異常處理,經常把異常和錯誤處理混為一談,關於代碼中的那些寫法,不是寫錯了,就是寫的太特麼爛了。恰好最近在寫一些類時用到異常處理了,順便就把這個整理下,但是這個僅代表我個人的一些理解和使用,也可能是錯誤的,還請謹慎閱讀。概述錯誤處理定義錯誤是指導致系統不能按照用戶意圖工作的一切原因、事件。
  • Jsonnet-PHP v1.2.0 發布, PHP 支持 Jsonnet 擴展
    Jsonnet-PHP v1.2.0發布了,JsonNet-PHP是Google Jsonnet對PHP的支持擴展,該版本使用最新版本至v0.9.5的LibJsonnet。
  • 再談PHP錯誤與異常處理
    > 2:register_shutdown_function()  捕獲PHP的錯誤:Fatal Error、Parse Error等,這個方法是PHP腳本執行結束前最後一個調用的函數,比如腳本錯誤、die()、exit、異常、正常結束都會調用,多麼牛逼的一個函數啊!
  • PHP 7.4.0 正式發布
    PHP 7.4.0發布了,此版本標誌著PHP 7系列的第四次特性更新。PHP 7.4.0進行了許多改進,並帶來了一些新特性,包括:Typed Properties類型屬性類屬性現在支持類型聲明,以下示例將強制$User-> id只能分配int值,而$User-> name只能分配string值。<?
  • php7異常與錯誤處理和自定義異常
    7.2版本異常與錯誤的概述什麼叫做異常?
  • InitPHP v3.8.1 發布,15 年,我們也是蠻拼的
    InitPHP v3.8.1版本發布,15年,我們也是蠻拼的 更新日誌: InitPHP V3.8.1
  • (安全篇)PHP 的錯誤機制詳解
    >// Fatal error: Call to undefined function hpinfo() in /tmp/php/index.php on line 5hpinfo();  //E_ERROR注意,如果有未被捕獲的異常,也是會觸發這個級別的。
  • InitPHP 框架發布 3.5 正式版
    InitPHP 3.5 修復日誌:1. 新增sign生成方法,用於接口間的數據籤名 2.
  • 攔截PHP各種異常和錯誤,發生致命錯誤時進行報警(一)
    種種以上,都是因為大家關閉了錯誤信息,並且未將錯誤、異常記錄到日誌,導致那些隨機發生的錯誤很難追蹤。這樣矛盾就來了,即不要顯示錯誤,又要追蹤錯誤,這如何實現了?,然後交給用戶自定義的方式進行處理'register_shutdown_function' 函數是在PHP腳本結束時調用的函數,配合'error_get_last'可以獲取最後的致命性錯誤這個思路大體就是把錯誤、異常、致命性錯誤攔截下來,交給我們自定義的方法進行處理,我們辨別這些錯誤、異常是否致命,如果是則記錄的資料庫或者文件系統,然後使用腳本不停的掃描這些日誌,發現嚴重錯誤立即發送郵件或發送簡訊進行報警
  • 乾貨分享:PHP的錯誤機制總結
    截至到php5.5,一共有16個錯誤級別注意:嘗試下面的代碼的時候請確保打開error_log:E_ERROR這種錯誤是致命錯誤,會在頁面顯示Fatal Error,當出現這種錯誤的時候,程序就無法繼續執行下去了錯誤示例:注意,如果有未被捕獲的異常,也是會觸發這個級別的。
  • Robbe-1.6.0 發布 - PHP開源中文分詞擴展, GBK支持
    Robbe是建立在Friso中文分詞器上的一個高性能php中文分詞擴展。同時支持對UTF-8/GBK編碼的切分。
  • PHP擴展開發:[1]簡單的HelloWord
    最近摸索CentOS7.0系統的操作比較多,而php對應的擴展部署加載也用的比較多,但是一直都沒有想去開發一個屬於自己的擴展,剛好最近需要用到這個擴展開發,開發一些小功能,所以就開始著手寫一個比較簡單的HelloWord擴展來記錄下。
  • 企業級微服務框架 PHP-MSF 發布 3.0.2 版本
    PHP-MSF企業級微服務框架3.0.2發布PHP微服務框架即「Micro Service Framework For PHP」,是Camera360社區伺服器端團隊基於Swoole自主研發現代化的PHP協程服務框架,簡稱msf或者php-msf,是Swoole的工程級企業應用框架,經受了Camera360億級用戶高並發大流量的考驗。
  • RuoYi-Vue 2.1 發布,支持表單構建
    若依前後端分離版本 v2.1 已發布,更新日誌: 新增表單構建
  • PHP7.0 的新特性
    php declare(strict_types=1)//1:嚴格模式 0:強制模式(默認)classOrderServiceextendsBaseService{...0;4.定義常量數組:define("ARR",[1,2,3])5.新增抽象語法樹AST(高度解耦)
  • (基礎篇) PHP需要它—PHP擴展庫
    表1.1  PHP內置擴展庫列表擴  展  庫說    明注    解php_bz2.dllBzip2壓縮函數庫無php_calendar.dll曆法轉換函數庫自PHP   4.0.3起內置php_cpdf.dllClibPDF
  • IMI 正式發布!基於 Swoole 的協程 PHP 開發框架
    支持 Aop ,支持使用註解和配置文件注入,完全遵守 PSR-3、4、7、11、15、16 標準規範。框架的擴展性強,開發者可以根據實際需求,自行開發相關驅動進行擴展。不止於框架本身提供的功能和組件!我們認為一個框架不僅需要代碼健壯、簡單易用,文檔也是十分重要,所以文檔的完善是我們工作的重點,相信一個好的文檔能夠讓你事半功倍!
  • PHP 2014簡體中文版CHM手冊 正式發布
    沒有任何一個數據丟失, 亂碼, 異常, 集成數據最全, 功能也最人性, 集成在線搜索及導航功能. 是學習php, 完成工作的利器. 工作室下載地址一直有效, 並且保持每月更新一次, 有需要的同學請經常下載更新.發現任何問題, 均可以告訴我們. 手冊更新日誌:  1: 增加a連結的顏色變化.