CodeIgniter4 記錄日志信息

2020-08-18 10:02 更新

你可以通過(guò) log_message() 方法將信息記錄在本地日志文件中,并且必須在第一個(gè)參數(shù)中指定錯(cuò)誤的”級(jí)別”,來(lái)表明這個(gè)信息的類型(debug,error等)。 第二個(gè)參數(shù)就是信息本身:

if ($some_var == '')
{
        log_message('error', 'Some variable did not contain a value.');
}

總共有八種不同的事件報(bào)錯(cuò)級(jí)別,與 RFC 5424 中所定義的錯(cuò)誤級(jí)別一一對(duì)應(yīng),它們是:

* **debug** - 詳細(xì)的debug信息。
* **info** - 你的應(yīng)用中的一些有意義的事件,例如用戶登錄,記錄SQL語(yǔ)句等。
* **notice** - 你的應(yīng)用中的一些正常但明顯有價(jià)值的事件。
* **warning** - 出現(xiàn)了異常,但不是錯(cuò)誤,例如使用了被廢棄的API,某個(gè)API的調(diào)用異常,或其他不期望出現(xiàn)的,但不是錯(cuò)誤的情況。
* **error** - 運(yùn)行時(shí)錯(cuò)誤,不需要立即被處理但通常需要被記錄或者監(jiān)控。
* **critical** - 危險(xiǎn)情況,例如某個(gè)程序組件不可用,或出現(xiàn)未被捕獲的異常等。
* **alert** - 告警,必須采取行動(dòng)來(lái)修復(fù),例如整個(gè)網(wǎng)站宕機(jī)或數(shù)據(jù)庫(kù)無(wú)法訪問(wèn)等。
* **emergency** - 系統(tǒng)不可用。

日志系統(tǒng)不提供警告系統(tǒng)管理員或網(wǎng)站管理者的方法,只是單純的記錄信息。對(duì)于諸多更為危險(xiǎn)的錯(cuò)誤級(jí)別,日志就會(huì)被異常調(diào)度器自動(dòng)拋出,如上所述。

配置

你可以修改 /app/Config/Logger.php 配置文件來(lái)修改哪些級(jí)別的事件會(huì)被實(shí)際記錄,以及為不同的事件等級(jí)分配不同的日志記錄器等。

配置文件中的 threshold (報(bào)錯(cuò)閾值)決定了從哪個(gè)級(jí)別開(kāi)始的事件將會(huì)在整個(gè)應(yīng)用中記錄下來(lái)。如果應(yīng)用中有任何低于報(bào)錯(cuò)閾值的事件記錄被記錄時(shí),這些請(qǐng)求將會(huì)被忽略。 最為簡(jiǎn)單的使用閾值的方法就是將其設(shè)為你希望記錄的報(bào)錯(cuò)等級(jí)的最低值。舉例來(lái)說(shuō),如果你想記錄warning信息,而不是information信息,就需要將報(bào)錯(cuò)閾值設(shè)為 5 。所有報(bào)錯(cuò)等級(jí)低于5的日志記錄請(qǐng)求 (包括運(yùn)行時(shí)錯(cuò)誤,系統(tǒng)錯(cuò)誤等)將會(huì)被記錄,而info, notice和debug級(jí)別的錯(cuò)誤就會(huì)被忽略:

public $threshold = 5;

關(guān)于報(bào)錯(cuò)級(jí)別和對(duì)應(yīng)的閾值的列表列舉在配置文件中以供參閱。

你可以通過(guò)給報(bào)錯(cuò)閾值賦值一個(gè)包含報(bào)錯(cuò)等級(jí)數(shù)字的數(shù)組,來(lái)選擇特定的報(bào)錯(cuò)級(jí)別:

// 只記錄debug和info類型的報(bào)錯(cuò)
public $threshold = [5, 8];

使用多個(gè)日志調(diào)度器

日志系統(tǒng)支持同時(shí)使用多種調(diào)度器來(lái)處理日志記錄。每一種調(diào)度器可以獨(dú)立地設(shè)置用于特定的錯(cuò)誤等級(jí),并忽略其他的。現(xiàn)狀而言,我們默認(rèn)安裝了兩種調(diào)度器以供使用:

  • 文件調(diào)度器 是默認(rèn)的調(diào)度器,它將會(huì)每天在本地創(chuàng)建一個(gè)獨(dú)立的日志文件,同時(shí)這也是較為被推薦的日志記錄方式。
  • ChromeLogger 調(diào)度器 如果你在Chrome瀏覽器上安裝了 ChromeLogger 擴(kuò)展 ,你可以使用這種調(diào)度器將日志輸出到Chrome的控制臺(tái)窗口中。

調(diào)度器配置于主配置文件中的 $handlers 屬性中,這一屬性的格式為一個(gè)包含一組調(diào)度器和它們對(duì)應(yīng)的配置的數(shù)組。 每個(gè)調(diào)度器被定義數(shù)組的鍵,格式為完整命名空間格式的類名,而對(duì)應(yīng)的值就是一個(gè)數(shù)組。 每個(gè)調(diào)度器配置塊中都會(huì)有一個(gè)通用的屬性: handle ,對(duì)應(yīng)著該調(diào)度器將要記錄的報(bào)錯(cuò)級(jí)別的 名字

public $handlers = [


        //--------------------------------------------------------------------
        // 文件調(diào)度器
        //--------------------------------------------------------------------


        'CodeIgniter\Log\Handlers\FileHandler' => [


                'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'],
        ]
];

根據(jù)上下文修改記錄信息

我們經(jīng)常會(huì)根據(jù)上下文來(lái)修改記錄信息的某些細(xì)節(jié)。比如說(shuō),可能會(huì)記錄用戶ID,IP地址,當(dāng)前的POST變量等。 你可以通過(guò)在信息中使用通配符來(lái)實(shí)現(xiàn)。每個(gè)通配符必須被大括號(hào)({}) 包裹起來(lái)。在第三個(gè)參數(shù)中,你需要提供一個(gè)包含有通配符名,與其對(duì)應(yīng)值的數(shù)組。 這些內(nèi)容將會(huì)插入到記錄信息字符串中:

// 生成一條例如這樣的信息:用戶123登錄系統(tǒng),登錄IP為127.0.0.1
$info = [
        'id' => $user->id,
        'ip_address' => $this->request->ip_address()
];


log_message('info', 'User {id} logged into the system from {ip_address}', $info);

如果你想記錄一條異?;蛞粋€(gè)錯(cuò)誤,你可以使用”exception”作為鍵,對(duì)應(yīng)的值就是這條異常或錯(cuò)誤本身。 這樣一來(lái)這個(gè)異常或錯(cuò)誤對(duì)象包含的錯(cuò)誤信息,文件名和對(duì)應(yīng)行號(hào)就會(huì)生成一條字符串。 你需要在記錄信息中中提供exception通配符:

try
{
        ... 一些能拋出異常的代碼
}
catch (\Exception $e)
{
        log_message('error', '[ERROR] {exception}', ['exception' => $e]);
}

存在幾個(gè)核心占位符,它們會(huì)根據(jù)當(dāng)前頁(yè)面請(qǐng)求為您自動(dòng)擴(kuò)展:

占位符 插入值
{post_vars} $ _POST變量
{get_vars} $ _GET變量
{session_vars} $ _SESSION變量
{env} 當(dāng)前環(huán)境名稱
{file} 調(diào)用記錄器的文件名
{line} {file}中調(diào)用記錄器的行
{env:foo} $ _ENV中'foo'的值

使用第三方日志器

你可以使用任何自己喜歡的日志器,只要它繼承了 Psr\Log\LoggerInterface 并符合 PSR3 規(guī)范。 這意味著你可以使用任何符合PSR-3規(guī)范的日志器,或者造一個(gè)自己的。

你需要將第三方日志器放入 /app/Config/Autoload.php 配置文件中或者通過(guò)某個(gè)自動(dòng)加載器,比如Composer,來(lái)保證第三方日志器在系統(tǒng)中可被找到。 接下來(lái)你需要修改 /app/Config/Services.php ,將 logger 的別名設(shè)置為新的日志器的類名。

現(xiàn)在開(kāi)始,對(duì) log_message() 的所有調(diào)用都會(huì)使用你自定義的日志器進(jìn)行日志記錄。

LoggerAware Trait(代碼復(fù)用)

當(dāng)你需要將你的日志庫(kù)以框架不感知的形式調(diào)用時(shí),你可以使用實(shí)現(xiàn)了 setLogger 方法的 CodeIgniter\Log\LoggerAwareTrait 。 從而當(dāng)在不同框架環(huán)境下使用日志庫(kù)時(shí),你的日志器依舊可如同預(yù)期一般運(yùn)行,只要它能找到一個(gè)符合PSR3的日志器。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)