はじめに
PHP フレームワークに触れたことのある友人は、プロジェクトにおけるログの重要な役割を知っているかもしれません。ログは、エラーの場所を特定し、プログラムをより使いやすくするのに役立ちます。 (適切に扱えば、プログラマのみが実際に使用できる大量の英語を直接吐き出すことはありません)、デバッグ中に非常に便利で、いくつかの重要な操作などを記録することもできます。ログシステムはありません。開発への道はすでにいばらと穴でいっぱいであり、必ずでこぼこが道にあります。
はじめに
PHP ログ システムをマスターするには、まずこれらのことを完全に理解する必要があります。
1. php
set_exception_handler(callback $exception_handler); //异常捕获自定义处理函数注册 set_error_handler(callback $error_handler); //错误捕获自定义处理函数注册 register_shutdown_function(callback $callback); //程序执行时异常终止错误捕获处理函数注册
のいくつかの関数これら 3 つの関数は、開発者にエラー処理制御とログ システムにおける多くの自律性を提供します。ログ情報の記録には、メリット。
プログラムで例外が発生すると、PHP カーネルは例外エラーをスローし、エラー メッセージをユーザーに出力します。例外処理関数が登録されている場合、PHP によってスローされた例外はカーネル自体に転送されます。定義された登録済み例外キャッチ関数には、実行する必要のある処理が含まれており、エラー情報 (エラーの詳細とエラーの場所を含む) が記録されます。関数が例外を処理した後、例外は終了します。
プログラムでエラーが発生した場合、登録したエラー処理関数は、エラー情報を関数内のエラー例外オブジェクトに変換し、例外処理関数に渡します。これは、最初の一歩。
レジューム時にシャットダウンエラーが発生した場合、登録した異常終了処理関数が実行され、error_get_last()で前回シャットダウン時のエラーオブジェクトを取得し、前項と同様にエラーを生成します。 .例外オブジェクトの場合、このオブジェクトを登録された例外処理関数に渡します。
ご覧のとおり、実際には、例外であってもエラーであっても、自身の情報を例外処理関数が認識する例外情報に変換して、例外処理関数に引き渡します。非例外情報は化粧のようなものです 女性同様、例外ハンドラはこれらの非例外情報を認識しません ロードとアンロードを解除するだけで(正確には非例外情報そのものが例外情報に変換されます)スローされる必要があります)、例外ハンドラーはそれを認識します。
php ログ システムのエラー処理プロセス
ここで問題が発生します。これらの関数は、通常、例外処理ライブラリとエラー ログ クラスと組み合わされます。ライブラリが機能するために使用されます. 例外処理クラス ライブラリには、登録される 3 つの関数が含まれています. ロギング クラス ライブラリは、ログ ファイルの場所を適切に記録して配置するために $Exception_handler で呼び出されます. 上記の関数は通常、次の場所にロードされ、登録されますプログラム フレームワークの入り口は次のようになります。
ここでは配列 (クラス、関数) メソッドが使用されます。
set_exception_handler(array("Myexception","exceptionHandler")); set_error_handler(array("Myexception","errorHandler")); register_shutdown_function(array("Myexception","shutdownHandler"));
2. 関連するクラス ライブラリのログ記録
最初の部分で紹介したものは、例外、エラー、シャットダウンのみをキャプチャします。これは最初のステップにすぎません。次に、ロギング クラス ライブラリが使用されるローカル ファイル システムにログ情報を記録するなど、取得した情報を合理的に処理する必要があります (この操作は array("MyException", "ExceptionHandler") で行われます)。 (以下で説明するクラス ライブラリは、kohana ログ システムの設計を利用しています)。
日本式ロギングも非常にシンプルです。ファイルの最後に情報を追加するだけです。これは簡単に実装できます。誰でも自分で実装できると思いますが、必要です。便利で、効率的で、拡張されたログを設計するには、ロギング クラス ライブラリはそれほど単純ではありません。長期間の練習を経て要約し、最適化する必要があります。kohana フレームワークのロギング クラス ライブラリは比較的成熟しているため、次のように使用できます。参考までにここにあります。
kohana を使用したことのあるユーザーは、kohana フレームワークのロギングについてよく知っていると思いますが、詳しくなくても問題ありません。以下のアプリケーション/ブートストラップで簡単に説明します。 kohana ソース コードの php ファイルです。行 109 ~ 112 に次のコードがあります:
/** * Attach the file write to logging. Multiple writers are supported. */ Kohana::$log->attach(new Log_File(APPPATH.'logs'));
これは、ログ オブジェクトをログ オブジェクトに追加するものです。オリーブ色の背景を持つ 2 つに注目してください。異なるクラス ライブラリ インスタンスです。 kohana では、ログ オブジェクトは 2 つの部分に分かれています。最初の部分はログ オブジェクトであり、ログ オブジェクトのリストを維持するために使用されます。これをどのように理解すればよいでしょうか。実際には、コンテナのようなものです。 1 つ以上のログ オブジェクト (これは 2 番目の部分であり、これらのログ オブジェクトは実際にログを記録するために使用されます)、オブジェクトごとに記録されるエラー レベルの配列があります。エラー レベルが満たされた場合にのみ記録されます。 、そうでない場合は省略されます。以下は、名前変更後の私自身の簡略化されたロギング方法です:
self::$log = Log::instance(); self::$log->attach(new Logwriter("./data/debug"),Log::DEBUG); self::$log->attach(new Logwriter("./data/notice"),Log::NOTICE);
我这里面为了更好地理解,将“容器”命名为Log,记录的实例命名为Logwriter,可以看到我在程序入口处很容易的添加了两不同的日志种类,第一个是记录所有错误号比Log::DEBUG小的错误(错误级别比他高),并按规则记录在文件夹./data/debug下面,第二个是记录级别等于或高于Log::NOTICE的错误,当然了你还可以更详细制定具体哪些错误好,传递数组就行了,这个就是我感觉方便、快捷的地方,我们可以根据需求来添加错误日志、分不同的日志目录,下面看一幅图也许会有助于理解:
log与logwriter的关系
通过上面的图你就会看到Log是一个容器,包含了具体的不同的logwriter对象,每个对象可能要记录不同的信息,当错误信息要刷到文件中的时候,会运行每一个Logwriter实例,看看自己是否要记录errormessage中的错误,errormessage中的level不包含在Logwriter内时忽略。
这本分和第一部分怎么合作的呢?
其实很简单,当exception捕获的异常时会调用添加一条错误信息(包括错误位置、错误代号、错误信息等信息)到Log容器中的errormessage数组中,然后当程序结束之后在将这些信息写入文件,这里还要注意下,也许你在阅读kohana代码是发现没有明显的直接写入到日志中去,这里面kohana优化的比较好,因为php的一次执行可能出现多个错误,如果来一个错误你就去记录一次这样会在程序返回之前占用多余的io和时间,所以kohana的做法是默认将所有的错误、异常、日志存放在Log::$errormessage中,并在实例化的时候讲Log中的writer操作注册register_shutdown_function,这个函数的作用是在程序异常终止或者执行完成之后执行,前面第一部分也有使用到,这样日志记录就不会对本次php的执行产生带大的影响。
推荐:《PHP培训》
以上がPHPフレームワークにおけるロギングシステムの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。