溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

使用SeasLog打造PHP項(xiàng)目中的高性能日志組件(一)

發(fā)布時(shí)間:2020-07-24 02:44:18 來(lái)源:網(wǎng)絡(luò) 閱讀:468 作者:yunzhihui 欄目:web開(kāi)發(fā)

 云智慧(北京)科技有限公司 高馳濤

 

什么是SeasLog

SeasLog是一個(gè)C語(yǔ)言編寫(xiě)的PHP擴(kuò)展,提供一組規(guī)范標(biāo)準(zhǔn)的功能函數(shù),在PHP項(xiàng)目中方便、規(guī)范、高效地寫(xiě)日志,以及快速地讀取和查詢(xún)?nèi)罩尽?/p>為什么使用SeasLog

無(wú)論在什么應(yīng)用中,log日志都是架構(gòu)中不可缺少的一個(gè)重要組成部分,它通常是系統(tǒng)或軟件、應(yīng)用的運(yùn)行記錄。通過(guò)log的分析,可以方便用戶(hù)了解系統(tǒng)或軟件、應(yīng)用的運(yùn)行情況;如果你的應(yīng)用log足夠豐富,也可以分析以往用戶(hù)的操作行為、類(lèi)型喜好、地域分布或其他更多信息;如果一個(gè)應(yīng)用的log同時(shí)也分了多個(gè)級(jí)別,那么可以很輕易地分析得到該應(yīng)用的健康狀況,及時(shí)發(fā)現(xiàn)問(wèn)題并快速定位、解決問(wèn)題,補(bǔ)救損失。

我們知道,php內(nèi)置了很多l(xiāng)og函數(shù),如error_log、syslog、file_put_content,這些函數(shù)功能強(qiáng)大且性能極好,但由于各種缺陷(error_log、file_put_content無(wú)錯(cuò)誤級(jí)別、無(wú)固定格式像是信馬由韁隨處亂畫(huà);syslog不區(qū)分模塊、而且與系統(tǒng)日志混合,讀syslog記錄會(huì)讓人抓狂的。),靈活度降低了很多,很不能滿(mǎn)足應(yīng)用需求?;旧纤械拈_(kāi)發(fā)者,都會(huì)自行設(shè)計(jì)封裝log庫(kù),當(dāng)然也會(huì)有很多開(kāi)發(fā)者選擇已有的開(kāi)源日志庫(kù)。

也有很多開(kāi)源log類(lèi)庫(kù)彌補(bǔ)了上述缺陷,如log4php、plog、Analog等(當(dāng)然也有很多應(yīng)用在項(xiàng)目中自己開(kāi)發(fā)的log類(lèi))。其中以log4php最為著名,它的設(shè)計(jì)精良、格式完美、文檔完善、功能強(qiáng)大。但是經(jīng)過(guò)測(cè)試,log4php的性能非常差。

這是log4php與SeasLog的性能對(duì)比圖:

使用SeasLog打造PHP項(xiàng)目中的高性能日志組件(一)

設(shè)計(jì)思路

那么有沒(méi)有一種log類(lèi)庫(kù)同時(shí)滿(mǎn)足以下需求呢:

·分模塊、分級(jí)別

·配置簡(jiǎn)單(最好是勿須配置)

·日志格式清晰易讀

·應(yīng)用簡(jiǎn)單、性能很棒

我們知道,PSR-3標(biāo)準(zhǔn)是一個(gè)國(guó)際化的日志標(biāo)準(zhǔn),它要求了模塊、級(jí)別、清晰、易用等日志工作應(yīng)具備的特點(diǎn)。因此,只要我們遵循了PSR-3標(biāo)準(zhǔn),則我們可以完成分模塊、分級(jí)別以及日志格式清晰易讀的要求。

配置簡(jiǎn)單這個(gè)需求也很好完成。如果嚴(yán)格按照既定規(guī)則,其實(shí)只需要設(shè)置默認(rèn)目錄就可以了。

 

OK,現(xiàn)在我們只剩下性能這一個(gè)要求。

既然是日志,免不了會(huì)寫(xiě)文件,或者通過(guò)pipe通過(guò)網(wǎng)絡(luò)傳送到某個(gè)存儲(chǔ)中心(我們暫不考慮存儲(chǔ)中心的設(shè)計(jì))??梢韵胍?jiàn),假設(shè)一個(gè)請(qǐng)求中需要寫(xiě)出1000log,那么勢(shì)必會(huì)有1000IO,這對(duì)性能將是一個(gè)很大的拖延點(diǎn)。一般對(duì)于處理這種多次相同的請(qǐng)求場(chǎng)景,我們要解決的其實(shí)也很簡(jiǎn)單,使用cachebuffer,把多次請(qǐng)求作歸并,從而降低對(duì)磁盤(pán)或網(wǎng)絡(luò)的IO,這是一個(gè)基本的思想。

SeasLog也是這么做的。設(shè)定一個(gè)buffer_size(默認(rèn)100log),使用PHP請(qǐng)求內(nèi)存,每寫(xiě)一次log,塞入內(nèi)存,同時(shí)buffer_size加;當(dāng)buffer_size等于設(shè)置值時(shí),則進(jìn)行一次IO,同時(shí)清除buffer; 當(dāng)然,如果請(qǐng)求結(jié)束了、或執(zhí)行了dieexit或其他異常退出時(shí),不管buffer_size有沒(méi)有攢夠設(shè)置值,立刻進(jìn)行一次IO,同時(shí)清除buffer

 

到目前為止,SeasLog的正式版本為1.1.6,采用Apache 2.0開(kāi)源協(xié)議,同時(shí)可以在php.net官方,和Github庫(kù)上獲得它的完整代碼。

Php.net     http://pecl.php.net/package/seaslog

Github      https://github.com/Neeke/SeasLog

目前提供了什么

·在PHP項(xiàng)目中便捷、規(guī)范地記錄log

·可配置的默認(rèn)log目錄與模塊

·指定log目錄與獲取當(dāng)前配置

·初步的分析預(yù)警框架

·高效的日志緩沖、便捷的緩沖debug

·遵循 PSR-3 日志接口規(guī)范

怎么安裝

獲得源碼后,可自行編譯。

$ /path/to/phpize

$ ./configure --with-php-config=/path/to/php-config

$ make && make install

 

當(dāng)然,使用PECL管理工具會(huì)更方便:

$ pecl install seaslog

 

seaslog.ini的配置

; configuration for php SeasLog module

extension = seaslog.so

seaslog.default_basepath = /log/seaslog-test    ;默認(rèn)log根目錄

seaslog.default_logger = default                ;默認(rèn)logger目錄

seaslog.disting_type = 1                            ;是否以type分文件 1是 0否(默認(rèn))

seaslog.disting_by_hour = 1                      ;是否每小時(shí)劃分一個(gè)文件 1是 0否(默認(rèn))

seaslog.use_buffer = 1                              ;是否啟用buffer 1是 0否(默認(rèn))

seaslog.buffer_size = 100                         ;buffer中緩沖數(shù)量 默認(rèn)0(不使用buffer_size)

seaslog.level = 0                                       ;記錄日志級(jí)別 默認(rèn)0(所有日志)

 

seaslog.disting_type = 1 開(kāi)啟以type分文件,即log文件區(qū)分info\warn\erro

seaslog.disting_by_hour = 1 開(kāi)啟每小時(shí)劃分一個(gè)文件

seaslog.use_buffer = 1 開(kāi)啟buffer。默認(rèn)關(guān)閉。當(dāng)開(kāi)啟此項(xiàng)時(shí),日志預(yù)存于內(nèi)存,當(dāng)請(qǐng)求結(jié)束時(shí)(或異常退出時(shí))一次寫(xiě)入文件。

seaslog.buffer_size = 100 設(shè)置緩沖數(shù)量為100. 默認(rèn)為0,即無(wú)緩沖數(shù)量限制.當(dāng)buffer_size大于0時(shí),緩沖量達(dá)到該值則寫(xiě)一次文件.

seaslog.level = 3 記錄的日志級(jí)別.默認(rèn)為0,即所有日志均記錄。當(dāng)level為1時(shí),關(guān)注debug以上級(jí)別(包括debug),以此類(lèi)推。level大于8時(shí),所有日志均不記錄。

 

默認(rèn)常量有哪些

遵循PSR-3標(biāo)準(zhǔn),SeasLog 共將日志分成8個(gè)級(jí)別

·SEASLOG_DEBUG "debug"

·SEASLOG_INFO "info"

·SEASLOG_NOTICE "notice"

·SEASLOG_WARNING "warning"

·SEASLOG_ERROR "error"

·SEASLOG_CRITICAL "critical"

·SEASLOG_ALERT "alert"

·SEASLOG_EMERGENCY "emergency"

關(guān)于作者:

高馳濤(Neeke),云智慧高級(jí)架構(gòu)師,PHP開(kāi)發(fā)組成員,同時(shí)也是PECL/SeasLog等多個(gè)開(kāi)源軟件作者與貢獻(xiàn)者。8年研發(fā)管理經(jīng)驗(yàn),早期從事大規(guī)模企業(yè)信息化研發(fā)架構(gòu),09年涉足互聯(lián)網(wǎng)數(shù)字營(yíng)銷(xiāo)領(lǐng)域并深入研究架構(gòu)與性能優(yōu)化。對(duì)高并發(fā)、高性能、高可用系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)有豐富經(jīng)驗(yàn)。崇尚規(guī)范、敏捷、高效、GettingReal。目前在云智慧致力于APM產(chǎn)品的架構(gòu)與研發(fā)。主要負(fù)責(zé)PHP、Python、Go等語(yǔ)言的底層擴(kuò)展與SmartAgent的架構(gòu)研發(fā)。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI