このツールは2008年にHighload.ruカンファレンスで初めて一般に公開され、その後、徹底的に最適化および完成されました。 動物の種類と使用することの便利さについて 読んでください。
記事の形式
最初に、ライブラリ機能全体の詳細な仕様ガイドを作成したいという要望がありました。 それから、その実用的な簡単な例を挙げてから、主要な機能のリストを簡単にリストする方がはるかに明確で理解しやすいことに気付きました。 など...
指の例
config.php-すべての定数は架空のものであり、一致するものはすべてランダムです。 これらの定数は例としてのみ提供されていることを理解することが重要です。 理想的には、それらをまったく使用せずにすべてを規定できます(詳細はlagger_init.phpを参照)。
<?php
define( 'SKIPER_DIR' , LOGS_DIR . DIRECTORY_SEPARATOR . 'skip' );
define( 'SKIPER_EXPIRE' , 60 * 60 * 24);
define( 'SKIPER_HASH_TEMPLATE' , '{file}{line}' );
define( 'ERRORS_STDOUT' , true );
define( 'ERRORS_STDOUT_TAGS' , null );
define( 'ERRORS_STDOUT_TEMPLATE' , '<div><font color="red"><b>{type}:</b> {message}<br /><em>{file} [{line}]</em></font></div>' );
define( 'ERRORS_LOGING' , true );
define( 'ERRORS_LOGING_TAGS' , 'warning,fatal' );
define( 'ERRORS_LOGING_FILEPATH' , LOGS_DIR . DIRECTORY_SEPARATOR . 'errors_log.htm' );
define( 'ERRORS_LOGING_LIMIT_SIZE' , 500000);
define( 'ERRORS_LOGING_LIMIT_DAYS' , 180);
define( 'ERRORS_LOGING_TEMPLATE' , '{date} {time} <a href="http://{host}{uri}">http://{host}{uri}</a><br /><b>{type}</b>: {message|htmlentities}<br />{file} [{line}]<hr />' );
define( 'ERRORS_SMS' , false ); // TODO: check /library/SmsSender.php before enable it
define( 'ERRORS_SMS_TAGS' , 'warning,fatal' );
define( 'ERRORS_SMS_TO' , '79627271169,79218550471' );
define( 'ERRORS_SMS_FROM' , 'MyWebSite' );
define( 'ERRORS_SMS_MESSAGE' , 'Web site error, check log at {date} {time}' );
define( 'ERRORS_EMAIL' , true ); // TODO: must be TRUE on production server
define( 'ERRORS_EMAIL_TAGS' , 'warning,fatal' );
define( 'ERRORS_EMAIL_FROM' , 'Lagger <lagger@mywebsite.com>' );
define( 'ERRORS_EMAIL_TO' , 'Jack Johnson <jack_admin@gmail.com>, mike_developer@gmail.com' );
define( 'ERRORS_EMAIL_SUBJECT' , '{type} error in my website' );
define( 'ERRORS_EMAIL_MESSAGE' , "Date: {date} {time}\nURL: http://{host}{uri}\nError({type}): {message}\nSource: {file} [{line}]\n\nPOST:\n{post}\n\nSESSION:\n{session}" );
define( 'DEBUG_STDOUT' , true );
define( 'DEBUG_STDOUT_TAGS' , 'test,high' );
define( 'DEBUG_STDOUT_TEMPLATE' , '<div><font color="green">{message|htmlentities}</font></div>' );
define( 'DEBUG_LOGING' , true );
define( 'DEBUG_LOGING_TAGS' , 'sql' );
define( 'DEBUG_LOGING_FILEPATH' , LOGS_DIR . DIRECTORY_SEPARATOR . 'debug_sql_log.csv' );
define( 'DEBUG_LOGING_LIMIT_SIZE' , 500000);
define( 'DEBUG_LOGING_LIMIT_DAYS' , 7);
define( 'DEBUG_LOGING_TEMPLATE' , "{date} {time};{process_id|csv};{microtime|csv};{tags|csv};{message|trim|csv}\n" );
* This source code was highlighted with Source Code Highlighter .
lagger_init.php - Laggerハンドラーの直接構成。 この場合、構成の定数からですが、それらなしでも可能です。
<?php
/**************************************************************
REGISTER EVENTSPACE VARS
**************************************************************/
$laggerES = new Lagger_Eventspace();
$laggerES->registerReference( 'host' , $_SERVER[ 'HTTP_HOST' ]);
$laggerES->registerReference( 'uri' , $_SERVER[ 'REQUEST_URI' ]);
$laggerES->registerReference( 'post' , $_POST);
$laggerES->registerReference( 'session' , $_SESSION); // Session must be already started!
$laggerES->registerCallback( 'date' , 'date' , array( 'Ym-d' ));
$laggerES->registerCallback( 'time' , 'date' , array( 'H:i:s' ));
$laggerES->registerCallback( 'microtime' , 'microtime' , array( true ));
$laggerES->registerVar( 'session_id' , session_id());
$laggerES->registerVar( 'process_id' , substr(md5(mt_rand()), 25));
/**************************************************************
REGISTER EVENTSPACE MODIFIERS
**************************************************************/
function varToStringLine($ value ) {
return str_replace(array( "\r\n" , "\r" , "\n" ), ' ' , is_scalar($ value ) ? $ value : var_export($ value , 1));
}
$laggerES->registerModifier( 'line' , 'varToStringLine' );
function quoteCSV($ string ) {
return varToStringLine(str_replace( ';' , '\\;' , $ string ));
}
$laggerES->registerModifier( 'csv' , 'quoteCSV' );
/**************************************************************
SKIPER
**************************************************************/
$daylySkiper = new Lagger_Skiper($laggerES, SKIPER_HASH_TEMPLATE, SKIPER_EXPIRE, new Lagger_ExpireList(SKIPER_DIR, '.dayly_skiper' ));
/**************************************************************
LAGGER INTERNAL ERRORS AND EXCEPTIONS HANDLING
**************************************************************/
$emailAction = new Lagger_Action_Mail(ERRORS_EMAIL_FROM, ERRORS_EMAIL_TO, ERRORS_EMAIL_SUBJECT, ERRORS_EMAIL_MESSAGE);
$emailAction->setSkiper($daylySkiper, 'errors_email' );
Lagger_Handler::addInternalErrorAction($emailAction);
/**************************************************************
DEBUG HANDLER
**************************************************************/
$debug = new Lagger_Handler_Debug($laggerES);
function toDebug($message, $tags = null ) {
if (isset($GLOBALS[ 'debug' ])) {
$GLOBALS[ 'debug' ]->handle($message, $tags);
}
}
if (DEBUG_STDOUT) {
// Allows to rewrite DEBUG_STDOUT_TAGS. Try $_GET['__debug'] = 'high' or $_GET['__debug'] = ''
$debugTagger = new Lagger_Tagger( '__debug' );
$debug->addAction( new Lagger_Action_Print(DEBUG_STDOUT_TEMPLATE), DEBUG_STDOUT_TAGS, $debugTagger);
$debug->addAction( new Lagger_Action_FirePhp( '{message}' , '{tags}' , FirePHP::INFO), DEBUG_STDOUT_TAGS, $debugTagger);
}
if (DEBUG_LOGING) {
$debug->addAction( new Lagger_Action_FileLog(DEBUG_LOGING_TEMPLATE, DEBUG_LOGING_FILEPATH, DEBUG_LOGING_LIMIT_SIZE, DEBUG_LOGING_LIMIT_DAYS), DEBUG_LOGING_TAGS);
}
// Just for fun in windows servers it will speak the text :)
if (stristr(PHP_OS, 'win' ) !== false ) {
$debug->addAction( new Lagger_Action_WinSpeak( '{message}' , 100), 'speak' );
}
/**************************************************************
ERRORS AND EXCEPTIONS HANDLERS
**************************************************************/
$errors = new Lagger_Handler_Errors($laggerES);
$exceptions = new Lagger_Handler_Exceptions($laggerES);
if (ERRORS_STDOUT) {
$printAction = new Lagger_Action_Print(ERRORS_STDOUT_TEMPLATE, false );
$errors->addAction($printAction);
$exceptions->addAction($printAction);
$errorsFirePhpAction = new Lagger_Action_FirePhp( '{message} {file} [{line}]' , '{type}' , FirePHP::ERROR);
$errors->addAction($errorsFirePhpAction);
$exceptions->addAction($errorsFirePhpAction);
}
if (ERRORS_LOGING) {
$logAction = new Lagger_Action_FileLog(ERRORS_LOGING_TEMPLATE, ERRORS_LOGING_FILEPATH, ERRORS_LOGING_LIMIT_SIZE, ERRORS_LOGING_LIMIT_DAYS);
$errors->addAction($logAction, ERRORS_LOGING_TAGS);
$exceptions->addAction($logAction, ERRORS_LOGING_TAGS);
}
if (ERRORS_SMS) {
$smsAction = new Lagger_Action_Sms(ERRORS_SMS_FROM, ERRORS_SMS_TO, ERRORS_SMS_MESSAGE, true );
$smsAction->setSkiper($daylySkiper, 'errors_sms' );
$errors->addAction($smsAction, ERRORS_SMS_TAGS);
$exceptions->addAction($smsAction, ERRORS_SMS_TAGS);
}
if (ERRORS_EMAIL) {
$errors->addAction($emailAction, ERRORS_EMAIL_TAGS);
$exceptions->addAction($emailAction, ERRORS_EMAIL_TAGS);
}
つまり
イベントハンドラには3つのクラスがあります。
- すべてのレベルのPHPシステムエラーハンドラー(E_FATALおよびE_COMPILEを含む)
- PHPの例外
- デバッグメッセージハンドラー
- ログファイルエントリ
- メール送信
- SMS送信
- 画面出力
- PHPコンソール拡張を介したGoogle Chromeコンソール出力とポップアップ通知
- FirePHPパネルの出力
- 例外を投げる
- Microsoftからのサムの声でのイベントテキストといえば:) Windowsのみ
- イベントの再処理を無視する(Lagger_Skiper)
- 可変イベントのリストを展開する機能を備えたミニテンプレートエンジン(怖がらないでください!非常に簡単です!)
- イベントのタグ付けと特定のタグでトリガーするアクションの設定
- GET(Lagger_Tagger)を介したアクショントリガータグの動的再定義
- エラー処理
- わずか20kbの簡潔なPHP5コード(100%OOP)
100%オープンソース
最新バージョンをダウンロード
ドキュメントではなく例
SVN /トランク
Google Codeプロジェクトページ
私はプロジェクトに参加したいすべての人に非常にうれしいです:)
建設的な批判とフィードバックをありがとうございました!