簡體   English   中英

自定義日志記錄-CakePHP(1.3)

[英]Customize logging - CakePHP (1.3)

我想擴展cakephp日志記錄功能。 運用

$this->log($msg, $level)

您可以將帶有$level$msg記錄到tmp / logs / $ level.log。

我想如何使用日志記錄是:

  1. 不同級別的單獨函數,例如$this->debug($msg) $this->log($msg, 'debug') $this->error($msg) $this->log($msg, 'debug') $this->error($msg)$this->log($msg, 'error')等進行記錄。
  2. 自動將類的名稱放在消息前面,例如,如果$this類型為“ MyClass”,則$this->debug($msg)將導致“ MyClass:$ msg”。

我知道我可以通過擴展AppModel,AppController等來擴展功能,但是由於我在應用程序中到處都需要該功能,所以我寧願擴展cakephp的Object,但是沒有找到一種穩定的機制(不想在蛋糕/文件夾中進行更改)。 盡管我打算為該功能實現一個新類,但是我不確定如何在cakephp中使用該類。

您能否給我一些提示,在哪里/如何整齊地實現這些擴展?

全球便利方法

好吧,您實際上無法在PHP中進行猴子修補 (至少為5.2),這對於在您離開后必須維護您的代碼的開發人員而言可能是一件好事。 :)

CakePHP-具有嚴格的約定的MVC框架-通過僅允許您單獨擴展所需的部分(例如AppModelAppController等)並保持面向對象的基礎不變,使您難以打破MVC范例核心(使其難以添加“可在任何地方使用”的代碼,以防止潛在的濫用)。

至於添加超越所有MVC分離的功能,則此位置為app/config/bootstrap.php 當您在此處放置代碼時,很明顯它不是框架的一部分(很正確),但是允許您在甚至加載CakePHP之前添加這些必需項。 這里的一些選擇可能是:

  1. 創建一個函數(例如一些自定義函數,例如error()以您喜歡的方式調用CakeLog::write() 。)
  2. 加載一個類(例如,加載您自己的日志類,如.. Log ,因此您可以在地方調用Log::error()
  3. 見下文:

記錄器API

Cake確實允許對諸如記錄器之類的東西進行許多自定義,但是不幸的是,在這種情況下,已經向我們公開了API。 登錄CakePHP的API如下,您可以在任何喜歡的位置使用任何一種方法(當然,前一種僅在類中使用):

$this->log($msg, $level) // any class extending `Object` inherits this
// or
CakeLog::write($level, $message); // this is actually what is called by the above

您要消除的任意$level參數實際上是一個強大的功能

$this->log('Cannot connect to SMTP server', 'email'); // logs to app/logs/email.log
// vs
$this->email('Cannot connect to SMTP server'); // ambiguous - does this send emails?

我們只是創建了一個全新的日志類型,而沒有編寫額外的代碼行,這很清楚我們的代碼的目的是什么。

自定義記錄器

核心開發人員具有遠見卓識,可以添加條件,允許我們完全替換logger類,如果我們希望:

function log($msg, $type = LOG_ERROR) {
    if (!class_exists('CakeLog')) { // winning
        require LIBS . 'cake_log.php';
    }
    // ...

如您所見,核心CakeLog類僅在不存在此類的情況下才會實例化,從而使您有機會插入自己創建的內容(或經過一些調整的精確副本-盡管您希望手動與核心同步更改) -升級時):

// app/config/bootstrap.php
App::import('Lib', 'CakeLog'); // copy cake/libs/cake_log.php to app/lib/cake_log.php

上面的代碼可以讓您完全控制應用程序中CakeLog類的實現,因此您可以執行類似將調用類名稱動態添加到日志消息中的操作。 但是,更直接的方法(以及其他類型的日志記錄,例如到數據庫)將是創建自定義日志流

CakeLog::config('file', array(
    'engine' => 'FileLog', // copy cake/libs/log/file_log.php to app/libs/log/file_log.php
));

TL; DR-盡管您可以在CakePHP引導程序之前加載自己的代碼,也可以在提供的每個MVC層中單獨使用它們,但是您不應篡改內核提供的對象層次結構。 這使得很難添加全局繼承的類方法。

我的建議:使用提供給您的API並專注於添加更多功能,而不是語法上的微妙之處。 :)

除了deizel所說的(順便說一句,deizel很棒的寫法)之外,您不必使用Cake的記錄器。 歡迎使用您想要的任何日志記錄系統。 選擇您喜歡的現有日志記錄框架可能是最安全的選擇。 bootstrap.php是執行任何require調用或初始化的好地方。

否則,如果您想在Cake中做事,建議您創建一個具有以下三個日志接口的插件:組件,行為和幫助器。 這樣,日志記錄功能將在您的模型,視圖和控制器中可用。 至於如何編寫代碼,我喜歡這樣的想法:將蛋糕類簡化為真正的日志記錄類的代理,並在代理中使用魔術方法__call()來解析日志記錄請求和環境,然后將該信息轉發給記錄器以統一處理。

您將能夠編寫諸如$this->MyLogger->oops("stubbed my toe")並可能有一個oops.log文件,其中包含您的消息以及任何其他信息(調用控制器/視圖/模型,時間和日期等) 。)您想包括在內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM