在 Yii2 中,log
元件使用了不同的 log target
(如 file
, db
等)來記錄日誌。每個日誌條目可以設定一個 prefix
,用於區分不同的日誌資訊來源。
增加 prefix
的方法
可以透過配置檔案或者自定義類來全域性設定日誌的 prefix
。
方法一:透過配置檔案設定 prefix
你可以在 config/web.php
或 config/main.php
中配置 log
元件的 targets
部分,新增的 prefix
。
1. 修改配置檔案 config/web.php
或 config/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.php
或 config/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
或需要複用邏輯的場景。