如何將訊息記錄到不同的檔案
Symfony 框架將記錄訊息組織成通道。預設情況下,有幾個通道,包括 doctrine
、event
、security
、request
等。通道會印在記錄訊息中,也可以用來將不同的通道導向不同的位置/檔案。
預設情況下,Symfony 會將每個訊息記錄到單一檔案中 (無論通道為何)。
注意
每個通道都對應到不同的記錄器服務 (monolog.logger.XXX
)。使用 php bin/console debug:container monolog
命令來查看完整的服務列表,並瞭解 如何自動裝配 Monolog 通道。
將通道切換到不同的處理器
現在,假設您想要將 security
通道記錄到不同的檔案。若要執行此操作,請建立新的處理器,並將其設定為僅記錄來自 security
通道的訊息。以下範例僅在 prod
設定環境 中執行此操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# config/packages/monolog.yaml
when@prod:
monolog:
handlers:
security:
# log all messages (since debug is the lowest level)
level: debug
type: stream
path: '%kernel.logs_dir%/security.log'
channels: [security]
# an example of *not* logging security channel messages for this handler
main:
# ...
# channels: ['!security']
警告
channels
設定僅適用於頂層處理器。巢狀於群組、緩衝區、篩選器、手指交叉或其他此類處理器內部的處理器將忽略此設定,並將處理傳遞給它們的每個訊息。
您可以使用不同的方式指定設定
1 2 3 4 5 6 7
channels: ~ # Include all the channels
channels: foo # Include only channel 'foo'
channels: '!foo' # Include all channels, except 'foo'
channels: [foo, bar] # Include only channels 'foo' and 'bar'
channels: ['!foo', '!bar'] # Include all channels, except 'foo' and 'bar'
建立您自己的通道
您可以一次變更 Monolog 記錄到的通道服務。這可以透過以下 設定 完成,或者透過使用 monolog.logger 標籤您的服務並指定服務應記錄到的通道來完成。使用標籤,注入到該服務中的記錄器會預先設定為使用您指定的通道。
設定沒有標籤服務的額外通道
您也可以設定額外的通道,而無需標記您的服務
1 2 3
# config/packages/monolog.yaml
monolog:
channels: ['foo', 'bar', 'foo_bar']
Symfony 會自動為每個通道註冊一個服務 (在此範例中,通道 foo
會建立一個名為 monolog.logger.foo
的服務)。為了將此服務注入到其他服務中,您必須更新服務設定以選擇要注入的特定服務。
如何自動裝配記錄器通道
從 MonologBundle 3.5 開始,您可以透過使用以下語法對您的服務引數進行類型提示來自動裝配不同的 Monolog 通道:Psr\Log\LoggerInterface $<camelCased channel name> + Logger
。<channel>
必須已在您的 Monolog 設定中預先定義。
例如,若要注入與 foo_bar
記錄器通道相關的服務,請像這樣變更您的建構函式
1 2 3 4 5
public function __construct(
- LoggerInterface $logger,
+ LoggerInterface $fooBarLogger,
) {
}
使用屬性設定記錄器通道
從 Monolog 3.5 開始,您也可以透過直接在您的服務類別上使用 #[WithMonologChannel]
屬性來設定記錄器通道
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// src/Service/MyFixtureService.php
namespace App\Service;
use Monolog\Attribute\WithMonologChannel;
use Psr\Log\LoggerInterface;
use Symfony\Bridge\Monolog\Logger;
#[WithMonologChannel('fixtures')]
class MyFixtureService
{
public function __construct(LoggerInterface $logger)
{
// ...
}
}
這樣一來,您可以避免手動宣告您的服務以使用特定通道。
3.5
#[WithMonologChannel]
屬性在 Monolog 3.5.0 中引入。