国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
基本用法
核心概念
日志等級(jí)
用法詳解
多個(gè)handler
添加額外的數(shù)據(jù)
使用上下文
使用processor
頻道的使用
Handler
Formatter
Processor
擴(kuò)展handler
參考
首頁 後端開發(fā) php教程 【PHP類庫】Monolog

【PHP類庫】Monolog

Jun 23, 2016 pm 01:34 PM

Monolog是PHP的一個(gè)日志類庫。相比于其他的日志類庫,它有以下的特點(diǎn):

  • 功能強(qiáng)大??梢园讶罩景l(fā)送到文件、socket、郵箱、數(shù)據(jù)庫和各種web services。
  • 遵循PSR3的接口規(guī)范??梢院茌p易的替換成其他遵循同一規(guī)范的日志類庫。
  • 良好的擴(kuò)展性。通過Handler、Formatter和Processor這幾個(gè)接口,可以對(duì)Monolog類庫進(jìn)行各種擴(kuò)展和自定義。

基本用法

安裝最新版本:

composer require monolog/monolog

要求PHP版本為5.3以上。

php<?phpuse Monolog\Logger;use Monolog\Handler\StreamHandler;// 創(chuàng)建日志頻道$log = new Logger('name');$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));// 添加日志記錄$log->addWarning('Foo');$log->addError('Bar');

核心概念

每一個(gè)Logger實(shí)例都包含一個(gè)頻道名(channel)和handler的堆棧。當(dāng)你添加一條記錄時(shí),記錄會(huì)依次通過handler堆棧的處理。而每個(gè)handler也可以決定是否把記錄傳遞到下一個(gè)堆棧里的下一個(gè)handler。

通過handler,我們可以實(shí)現(xiàn)一些復(fù)雜的日志操作。例如我們把StreamHandler放在堆棧的最下面,那么所有的日志記錄最終都會(huì)寫到硬盤文件里。同時(shí)我們把MailHandler放在堆棧的最上面,通過設(shè)置日志等級(jí)把錯(cuò)誤日志通過郵件發(fā)送出去。Handler里有個(gè)$bubble屬性,這個(gè)屬性定義了handler是否攔截記錄不讓它流到下一個(gè)handler。所以如果我們把MailHandler的$bubble參數(shù)設(shè)置為false,則出現(xiàn)錯(cuò)誤日志時(shí),日志會(huì)通過MailHandler發(fā)送出去,而不會(huì)經(jīng)過StreamHandler寫到硬盤上。

Logger可以創(chuàng)建多個(gè),每個(gè)都可以定義自己的頻道名和handler堆棧。handler可以在多個(gè)Logger中共享。頻道名會(huì)反映在日志里,方便我們查看和過濾日志記錄。

如果沒有指定日志格式(Formatter),Handler會(huì)使用默認(rèn)的Formatter。

日志的等級(jí)不能自定義,目前使用的是RFC 5424里定義的8個(gè)等級(jí):debug、info、notice、warning、error、critical、alert和emergency。如果對(duì)日志記錄有其他的需求,可以通過Processo對(duì)日志記錄添加內(nèi)容。

日志等級(jí)

  • DEBUG (100): 詳細(xì)的debug信息。
  • INFO (200): 關(guān)鍵事件。
  • NOTICE (250): 普通但是重要的事件。
  • WARNING (300): 出現(xiàn)非錯(cuò)誤的異常。
  • ERROR (400): 運(yùn)行時(shí)錯(cuò)誤,但是不需要立刻處理。
  • CRITICA (500): 嚴(yán)重錯(cuò)誤。
  • EMERGENCY (600): 系統(tǒng)不可用。

用法詳解

多個(gè)handler

php<?phpuse Monolog\Logger;use Monolog\Handler\StreamHandler;use Monolog\Handler\FirePHPHandler;// 創(chuàng)建Logger實(shí)例$logger = new Logger('my_logger');// 添加handler$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));$logger->pushHandler(new FirePHPHandler());// 開始使用$logger->addInfo('My logger is now ready');

第一步我們先創(chuàng)建一個(gè)Logger實(shí)例,傳入的是頻道名,這個(gè)頻道名可以用于區(qū)分多個(gè)Logger實(shí)例。

實(shí)例本身并不知道如何處理日志記錄,它是通過handler進(jìn)行處理的。handler可以設(shè)置多個(gè),例如上面的例子設(shè)置了兩個(gè)handler,可以對(duì)日志記錄進(jìn)行兩種不同方式的處理。

需要注意的是,由于handler是采用堆棧的方式保存,所以后面添加的handler位于棧頂,會(huì)首先被調(diào)用。

添加額外的數(shù)據(jù)

Monolog有兩種方式對(duì)日志添加額外的信息。

使用上下文

第一個(gè)方法是使用$context參數(shù),傳入一個(gè)數(shù)組:

php<?php$logger->addInfo('Adding a new user', array('username' => 'Seldaek'));

使用processor

第二個(gè)方法是使用processor。processor可以是任何可調(diào)用的方法,這些方法把日志記錄作為參數(shù),然后經(jīng)過處理修改extra部分后返回。

php<?php$logger->pushProcessor(function ($record) {    $record['extra']['dummy'] = 'Hello world!';    return $record;});

Processor不一定要綁定在Logger實(shí)例上,也可以綁定到某個(gè)具體的handler上。使用handler實(shí)例的pushProcessor方法進(jìn)行綁定。

頻道的使用

使用頻道名可以對(duì)日志進(jìn)行分類,這在大型的應(yīng)用上是很有用的。通過頻道名,可以很容易的對(duì)日志記錄進(jìn)行刷選。

例如我們想在同一個(gè)日志文件里記錄不同模塊的日志,我們可以把相同的handler綁定到不同的Logger實(shí)例上,這些實(shí)例使用不同的頻道名:

php<?phpuse Monolog\Logger;use Monolog\Handler\StreamHandler;use Monolog\Handler\FirePHPHandler;// 創(chuàng)建handler$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);$firephp = new FirePHPHandler();// 創(chuàng)建應(yīng)用的主要logger$logger = new Logger('my_logger');$logger->pushHandler($stream);$logger->pushHandler($firephp);// 通過不同的頻道名創(chuàng)建一個(gè)用于安全相關(guān)的logger$securityLogger = new Logger('security');$securityLogger->pushHandler($stream);$securityLogger->pushHandler($firephp);

Handler

Monolog內(nèi)置很多很實(shí)用的handler,它們幾乎囊括了各種的使用場(chǎng)景,這里介紹一些使用的:
StreamHandler:把記錄寫進(jìn)PHP流,主要用于日志文件。
SyslogHandler:把記錄寫進(jìn)syslog。
ErrorLogHandler:把記錄寫進(jìn)PHP錯(cuò)誤日志。
NativeMailerHandler:使用PHP的mail()函數(shù)發(fā)送日志記錄。
SocketHandler:通過socket寫日志。

php<?phpuse Monolog\Logger;use Monolog\Handler\SocketHandler;// Create the logger$logger = new Logger('my_logger');// Create the handler$handler = new SocketHandler('unix:///var/log/httpd_app_log.socket');$handler->setPersistent(true);// Now add the handler$logger->pushHandler($handler, Logger::DEBUG);// You can now use your logger$logger->addInfo('My logger is now ready');

AmqpHandler:把記錄寫進(jìn)兼容amqp協(xié)議的服務(wù)。
BrowserConsoleHandler:把日志記錄寫到瀏覽器的控制臺(tái)。由于是使用瀏覽器的console對(duì)象,需要看瀏覽器是否支持。
RedisHandler:把記錄寫進(jìn)Redis。
MongoDBHandler:把記錄寫進(jìn)Mongo。
ElasticSearchHandler:把記錄寫到ElasticSearch服務(wù)。
BufferHandler:允許我們把日志記錄緩存起來一次性進(jìn)行處理。

更多的Handler請(qǐng)看https://github.com/Seldaek/monolog#handlers。

Formatter

同樣的,這里介紹幾個(gè)自帶的Formatter:
LineFormatter:把日志記錄格式化成一行字符串。
HtmlFormatter:把日志記錄格式化成HTML表格,主要用于郵件。
JsonFormatter:把日志記錄編碼成JSON格式。
LogstashFormatter:把日志記錄格式化成logstash的事件JSON格式。
ElasticaFormatter:把日志記錄格式化成ElasticSearch使用的數(shù)據(jù)格式。

更多的Formatter請(qǐng)看https://github.com/Seldaek/monolog#formatters。

Processor

前面說過,Processor可以為日志記錄添加額外的信息,Monolog也提供了一些很實(shí)用的processor:
IntrospectionProcessor:增加當(dāng)前腳本的文件名和類名等信息。
WebProcessor:增加當(dāng)前請(qǐng)求的URI、請(qǐng)求方法和訪問IP等信息。
MemoryUsageProcessor:增加當(dāng)前內(nèi)存使用情況信息。
MemoryPeakUsageProcessor:增加內(nèi)存使用高峰時(shí)的信息。

更多的Processor請(qǐng)看https://github.com/Seldaek/monolog#processors。

擴(kuò)展handler

Monolog內(nèi)置了很多handler,但是并不是所有場(chǎng)景都能覆蓋到,有時(shí)需要自己去定制handler。寫一個(gè)handler并不難,只需要實(shí)現(xiàn)Monolog\Handler\HandlerInterface這個(gè)接口即可。

下面這個(gè)例子實(shí)現(xiàn)了把日志記錄寫到數(shù)據(jù)庫里。我們不需要把接口里的方法全部實(shí)現(xiàn)一次,可以直接使用Monolog提供的抽象類AbstractProcessingHandler進(jìn)行繼承,實(shí)現(xiàn)里面的write方法即可。

php<?phpuse Monolog\Logger;use Monolog\Handler\AbstractProcessingHandler;class PDOHandler extends AbstractProcessingHandler{    private $initialized = false;    private $pdo;    private $statement;    public function __construct(PDO $pdo, $level = Logger::DEBUG, $bubble = true)    {        $this->pdo = $pdo;        parent::__construct($level, $bubble);    }    protected function write(array $record)    {        if (!$this->initialized) {            $this->initialize();        }        $this->statement->execute(array(            'channel' => $record['channel'],            'level' => $record['level'],            'message' => $record['formatted'],            'time' => $record['datetime']->format('U'),        ));    }    private function initialize()    {        $this->pdo->exec(            'CREATE TABLE IF NOT EXISTS monolog '            .'(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)'        );        $this->statement = $this->pdo->prepare(            'INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)'        );    }}

然后我們就可以使用它了:

php<?php$logger->pushHandler(new PDOHandler(new PDO('sqlite:logs.sqlite'));// You can now use your logger$logger->addInfo('My logger is now ready');

參考

https://github.com/Seldaek/monolog

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? 如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在於驗(yàn)證文件類型、重命名文件並限制權(quán)限。 1.使用finfo_file()檢查真實(shí)MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲(chǔ)至非Web根目錄;3.通過php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在於類型檢查的嚴(yán)格程度。 ==在比較前會(huì)進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會(huì)返回true,例如5==="5"返回false。使用場(chǎng)景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時(shí)使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運(yùn)算的方法如下:1.加法用 號(hào),支持整數(shù)和浮點(diǎn)數(shù),也可用於變量,字符串?dāng)?shù)字會(huì)自動(dòng)轉(zhuǎn)換但不推薦依賴;2.減法用-號(hào),變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號(hào),適用於數(shù)字及類似字符串;4.除法用/號(hào),需避免除以零,並註意結(jié)果可能是浮點(diǎn)數(shù);5.取模用%號(hào),可用於判斷奇偶數(shù),處理負(fù)數(shù)時(shí)餘數(shù)符號(hào)與被除數(shù)一致。正確使用這些運(yùn)算符的關(guān)鍵在於確保數(shù)據(jù)類型清晰並處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴(kuò)展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(dòng)(通過PECL或Composer安裝)創(chuàng)建客戶端實(shí)例並操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用於高性能場(chǎng)景,Predis則便於快速部署;兩者均適用於生產(chǎn)環(huán)境且文檔完善。

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles