1. 程式人生 > >高效能的PHP日誌系統 SeasLog

高效能的PHP日誌系統 SeasLog

參考文件:http://neeke.github.io/SeasLog/

什麼是SeasLog

SeasLog是一個C語言編寫的PHP擴充套件,提供一組規範標準的功能函式,在PHP專案中方便、規範、高效地寫日誌,以及快速地讀取和查詢日誌。

一.什麼是日誌系統

1. 記錄系統執行時的資訊

2. 系統日誌、應用程式日誌、安全日誌

3. 日誌功能不應該影響到使用者的正常使用

二.為什麼需要日誌功能

1. 瞭解系統執行情況

2. 記錄使用者操作資訊

3. 收集資料

三.為什麼選擇SeasLog

1. 高效能(C語言做的 先將日誌寫入記憶體達到一定量再寫入檔案比頻繁寫入檔案好)。

2. 無需配置

3. 功能完善、

4. 使用簡單

四.安裝SeasLog

1.首先要下載SeasLog

$lastLogger_1 = SeasLog::getLastLogger();

SeasLog::setLogger('testModule/app1');
$lastLogger_2 = SeasLog::getLastLogger();


2.在windows系統配置SeasLog

找到適合自己php版本的seaslog.dll,將 php_seaslog.dll放在php安裝目錄的的ext下面

修改php.ini的配置,並增加應的引數配置

seaslog.disting_type = 1

 開啟以type分檔案,即log檔案區分info\warn\erro

seaslog.disting_by_hour = 1 開啟每小時劃分一個檔案

seaslog.use_buffer = 1 開啟buffer。預設關閉。當開啟此項時,日誌預存於記憶體,當請求結束時(或異常退出時)一次寫入檔案。

seaslog.buffer_size = 100 設定緩衝數量為100. 預設為0,即無緩衝數量限制.當buffer_size大於0時,緩衝量達到該值則寫一次檔案.

seaslog.level = 3 記錄的日誌級別.預設為0,即所有日誌均記錄。當level為1時,關注debug以上級別(包括debug),以此類推。level大於8時,所有日誌均不記錄


儲存php.ini並且重新伺服器語言,然後執行phpinfo();可以看到

五.SeasLog Logger的使用

 1.獲取與設定basePath 

$basePath_1=SeasLog::getBasePath();SeasLog::setBasePath('/log/base_test');$basePath_2=SeasLog::getBasePath();

直接使用 SeasLog::getBasePath(),將獲取php.ini(seaslog.ini)中設定的seaslog.default_basepath 的值。

使用 SeasLog::setBasePath() 函式,將改變 SeasLog::getBasePath() 的取值。

2.設定logger與獲取lastLogger

$lastLogger_1 = SeasLog::getLastLogger();

   SeasLog::setLogger('testModule/app1');
   $lastLogger_2 = SeasLog::getLastLogger();

與basePath相類似的,

直接使用 SeasLog::getLastLogger(),將獲取php.ini(seaslog.ini)中設定的seaslog.default_logger 的值。

使用 SeasLog::setLogger() 函式,將改變 SeasLog::getLastLogger() 的取值。

3.快速寫入log

上面已經設定過了basePath與logger,於是log記錄的目錄已經產生了,

log記錄目錄 = basePath / logger / {fileName}.log log檔名,以 年月日 分檔案,如今天是2014年02月18日期,那麼 {fileName} = 20140218;

還記得 php.ini 中設定的 seaslog.disting_type 嗎?

預設的 seaslog.disting_type = 0,如果今天我使用了 SeasLog ,那麼將產生最終的log檔案:

  • LogFile = basePath / logger / 20140218.log
  • log格式統一為: {type} | {pid} | {timeStamp} |{dateTime} | {logInfo}

<?php
           SeasLog::setBasePath('E:www/seaslog/log/base_test');
          SeasLog::info('this is a info');
     ?>

seaslog.disting_type = 0   產生檔案 20160224.log

  seaslog.disting_type = 1 , seaslog.disting_by_hour = 0     產生檔案 info.20160224.log

seaslog.disting_type = 1 , seaslog.disting_by_hour   =  1   產生檔案 info.2016022411.log  開啟檔案顯示:  log格式統一為:  {type} | {pid} | {timeStamp}      |{dateTime}            | {logInfo}   info       | 10144 | 1456283442.408 | 2016:02:24 11:10:42 | this is a info 

  4.常量列表

SeasLog 共將日誌分成8個級別

  • 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級別
*/

5.SeasLog Analyzer的使用

      快速統計某型別log的count值

SeasLog在擴充套件中使用管道呼叫shell命令 grep -wc快速地取得count值,並返回值(array || int)給PHP。

 $countResult_1 = SeasLog::analyzerCount();
     $countResult_2 = SeasLog::analyzerCount(SEASLOG_WARNING);
     $countResult_3 = SeasLog::analyzerCount(SEASLOG_ERROR,date('Ymd',time()));
例子:
<span style="font-size:18px;"><?php 
SeasLog::setBasePath('E:www/seaslog/log/base_test');

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'));
?></span>
執行:
<span style="font-size:18px;"><?php </span>
<span style="font-size:18px;">$data = SeasLog::analyzerCount();
print_r($data);
echo "<br/>";
$data1 = SeasLog::analyzerCount(SEASLOG_WARNING);
print_r($data1);
echo "<br/>";
$data2 = SeasLog::analyzerCount(SEASLOG_ERROR,date('Ymd',time()));
print_r($data2);
echo "<br/>";</span>
<span style="font-size:18px;">?></span>
輸出: Array ( [debug] => 2 [info] => 2 [notice] => 2 [warning] => 2 [error] => 4 [critical] => 2 [alert] => 2 [emergency] => 2 ) 
2
4

獲取某型別log列表

SeasLog在擴充套件中使用管道呼叫shell命令 grep -w快速地取得列表,並返回array給PHP

執行:

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


echo "<pre>";
print_r($detailErrorArray_inAll);
echo "</pre>";


echo "<pre>";
print_r($detailErrorArray_today);
echo "</pre>";

輸出:


SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ymd',time()));
只取得當前模組下,當前一天內,level為SEASLOG_ERROR 的資訊列表:

同理,取當月
$detailErrorArray_mouth = SeasLog::analyzerDetail(SEASLOG_ERROR,date('Ym',time()));

使用SeasLog進行健康預警

預警的配置

[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] = [email protected]
email[smtp_pwd] = seaslog#demo
email[mail_from] = [email protected]
email[mail_to] = [email protected]
email[mail_cc] = [email protected]
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] = [email protected]

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配置

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


相關推薦

高效能PHP日誌系統 SeasLog

參考文件:http://neeke.github.io/SeasLog/ 什麼是SeasLog SeasLog是一個C語言編寫的PHP擴充套件,提供一組規範標準的功能函式,在PHP專案中方便、規範、高效地寫日誌,以及快速地讀取和查詢日誌。 一.什麼是日誌系統 1. 記

php日誌擴充套件 seasLog

https://github.com/SeasX/SeasLog/blob/master/README_zh.md   PECL安裝SeasLog $ pecl install seaslog seaslog.ini的配置 [SeasLog] ;configuratio

打造高效能日誌系統

前言    說起日誌系統, 大家都不陌生, 每次線上出了問題, 大家通常都會第一時間抓log回來進行分析, 很多時候這些log是我們恢復現場的重要途徑也可能成為了唯一手段, 所以重要性不言而喻. 市面上的開源日誌系統有很多, 如log4cxx, log4cpp, glog等

PHP執行系統命令的有幾個常用的函數

exe 自動 文件操作 nal 外部命令 中間 ring 打開 lcm PHP執行系統命令的有幾個常用的函數,如有:system函數、exec函數、popen函數,passthru,shell_exec函數他們都可以執行系統命令,不過前提時必須系統給了權限了哦。 syste

PHP 執行系統外部命令 system() exec() passthru()

dsl 時有 輸出 處理 介紹 要花 區別 safe function PHP中調用外部命令,可以用如下三種方法來實現: 方法一:用PHP提供的專門函數(四個): PHP提供4個專門的執行外部命令的函數:exec(), system(), passthru

Tomcat日誌系統詳解

mat core catalina res 最大的 tor dumps 異常 startup 綜合:Tomcat下相關的日誌文件 catalina引擎的日誌文件,文件名:catalina.日期.log Tomcat下內部代碼丟出的日誌,文件名localhost.日期.lo

Spring Boot入門第三天:配置日誌系統和Druid數據庫連接池。

禁用 css ret 輸入 ogg servlet log http gif 一、日誌管理 1.在application.properties文件中加入如下內容: logging.level.root=WARN logging.level.org.springfram

PHP 執行系統外部命令的方法 system() exec()

命令結果 所有 最後一行 之前 ech 返回結果 mman 程序 arr PHP作為一種服務器端的腳本語言,像編寫簡單、或者是復雜的動態網頁這樣的任務,它完全能夠勝任。但事情不總是如此,有時為了實現某個功能,必須借助於操作系統的外部程序(或者稱之為命令),這樣可以做到事半功

CentOS 6 添加php-fpm系統服務

restart 生成 kill -9 tar usr kcon amp -h ini 簡介: php-fpm安裝完成後默認不會註冊為系統服務,所以需要手工添加系統服務腳本。在/etc/init.d目錄下新建php-fpm文件,並更改權限其即可。 1、檢測/usr/

第二十三周微職位elk日誌系統

elk+nginx日誌系統利用ELK+redis搭建一套nginx日誌分析平臺。logstash,elasticsearch,kibana 怎麽進行nginx的日誌分析呢?首先,架構方面,nginx是有日誌文件的,它的每個請求的狀態等都有日誌文件進行記錄。其次,需要有個隊列,redis的list結構正好可以作

Javaweb日誌系統

部署 項目管理工具 管理 配置 att 項目 ica sym nbsp 1.SLF4J SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。按照官方的說法,SLF4J是一個用於日誌

部署 Graylog 日誌系統 - 每天5分鐘玩轉 Docker 容器技術(92)

docker 教程 容器 Graylog 是與 ELK 可以相提並論的一款集中式日誌管理方案,支持數據收集、檢索、可視化 Dashboard。本節將實踐用 Graylog 來管理 Docker 日誌。Graylog 架構Graylog 架構如下圖所示:Graylog 負責接收來自各種設備和應用的日

日誌系統

進行 5.5.0 worker stdout 時區 小時 存儲 match 基本用法 從ELK到EFK演進 背景 作為中國最大的在線教育站點,目前滬江日誌服務的用戶包含網校,交易,金融,CCTalk 等多個部門的多個產品的日誌搜索分析業務,每日產生的各類日誌有好十幾

.NET下使用 Seq結構化日誌系統

eof 檢索 fig 直連 自定義 兩個 img 性能 collect 前言 我們公司在日誌管理方面一直沒有統一,主要痛點有: 每個開發人員都是各用各的,存儲日誌的形式也是五花八門,如:本地文件,數據庫,Redis,MongoDB 由於公司訪問服務器要通過堡壘機

graylog 2.3.2 日誌系統安裝指南

graylog cnop Java (>= 8)MongoDB 3.2Elasticsearch 2.Xgraylog 2.3.2IP 192.168.0.210centos 7.xIP 192.168.0.210 (單機測試) 結構:mongodb + elasticsearch + gra

數據庫日誌系統分解

mysql 日誌標題索引日誌分類日誌操作日誌分解日誌分類 在數據庫系統中日誌主要分為6類,具體如下: 1、查詢日誌:主要記錄日常查詢的記錄; 2、慢查詢日誌:主要記錄查詢時長超過設置的數值時間的語句,方便DBA運維人員進行查詢; 3、錯誤日誌:主要用於記錄錯誤的事件,方便DBA運維人員

記錄日誌系統ELKB 5.6.4的搭建過程

logstash elk stack 集中式日誌系統 前言ELK是最近比較流行的免費的日誌系統解決方案,註意,ELK不是一個軟件名,而是一個結局方案的縮寫,即Elasticsearch+Logstash+Kibana(ELK Stack),其中Logstash負責日誌的采集和過濾,Elastics

centos7 部署 ELK 日誌系統

stash 修改配置 ali 分享 install .cn data entos 生產環境 =============================================== 2017/12/17_第1次修改 ccb

Slf4j與其他日誌系統兼容的使用

console 項目 load 循環 bridge 1.2 關於 重新 順序 java生產的各種框架(如spring等)裏各個框架會使用不同的日誌體系,多個不同日誌在一個jvm裏混搭會出現一定問題 ,這裏梳理一下java體系裏常見的日誌框架,以SFL4j為中心介紹下跟各個日

基於面部識別的日誌系統的設計與實現

history 教訓 並且 else -o 經驗 文件 self 線程 基於面部識別的日誌系統的設計與實現 @(GUI程序開發)[PyQt, 信號, 面部識別, 多線程, 媒體播放, opencv] [TOC] 需求與設計 使用面部識別技術,識別進出重要通道的人員,並對