Yii2自定義日誌字首

闲云-野鹤發表於2024-09-13

在 Yii2 中,log 元件使用了不同的 log target(如 file, db 等)來記錄日誌。每個日誌條目可以設定一個 prefix,用於區分不同的日誌資訊來源。

增加 prefix 的方法

可以透過配置檔案或者自定義類來全域性設定日誌的 prefix

方法一:透過配置檔案設定 prefix

你可以在 config/web.phpconfig/main.php 中配置 log 元件的 targets 部分,新增的 prefix

1. 修改配置檔案 config/web.phpconfig/main.php

return [
    'components' => [
        'log' => [
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'logFile' => '@runtime/logs/app.log',
                    'levels' => ['error', 'warning'],
                    'prefix' => function ($message) {
                        // 設定自定義的全域性 prefix
                        return '[GlobalPrefix] ' . Yii::$app->id . ' ';
                    },
                ],
            ],
        ],
    ],
];

在上面的配置中,prefix 是一個匿名函式,返回你想要的 prefix。可以使用 Yii2 的各種資訊(如 Yii::$app->id, Yii::$app->user->id 等)來定製這個 prefix

2. 日誌輸出的格式:

這會在日誌檔案的每一條記錄前面加上 [GlobalPrefix] 應用ID,從而實現全域性 prefix 的效果。

方法二:透過自定義日誌目標類增加 prefix

如果你需要在多個日誌目標中使用相同的全域性 prefix,可以透過繼承 yii\log\Target 來建立一個自定義的日誌目標類。

1. 建立自定義的日誌目標類

首先,建立一個繼承自 yii\log\FileTarget 或其他日誌目標的類,並重寫 getMessagePrefix() 方法:

namespace app\components;

use yii\log\FileTarget;

class CustomLogTarget extends FileTarget
{
    // 重寫 getMessagePrefix() 方法,設定全域性字首
    public function getMessagePrefix($message)
    {
        // 這裡可以自定義 prefix 內容
        return '[GlobalPrefix] ' . Yii::$app->id . ' ';
    }
}

2. 修改配置檔案使用自定義日誌目標

config/web.phpconfig/main.php 中配置日誌元件,使用你自定義的 CustomLogTarget

return [
    'components' => [
        'log' => [
            'targets' => [
                [
                    'class' => 'app\components\CustomLogTarget',
                    'logFile' => '@runtime/logs/custom_app.log',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
    ],
];

3. 日誌輸出的格式:

這樣所有使用 CustomLogTarget 的日誌目標都會包含自定義的全域性 prefix,而不需要為每一個目標單獨設定。

總結

  • 方法一:透過在配置檔案中為每個 log target 手動設定 prefix,適合簡單的場景。
  • 方法二:透過繼承日誌目標類重寫 getMessagePrefix() 方法,適合需要大量使用相同 prefix 或需要複用邏輯的場景。

相關文章