How to Log Messages to different Files

The Symfony Framework organizes log messages into channels. By default, there are several channels, including doctrine, event, security, request and more. The channel is printed in the log message and can also be used to direct different channels to different places/files.

Symfony フレームワークは、ログ メッセージをチャネルに編成します。デフォルトでは、ドクトリン、イベント、セキュリティ、リクエストなどを含むいくつかのチャネルがあります。チャネルはログ メッセージに出力され、異なるチャネルを異なる場所/ファイルに送信するためにも使用できます。

By default, Symfony logs every message into a single file (regardless of the channel).

デフォルトでは、Symfony はすべてのメッセージを (チャネルに関係なく) 単一のファイルに記録します。

Note

ノート

Each channel corresponds to a different logger service (monolog.logger.XXX) Use the php bin/console debug:container monolog command to see a full list of services and learn how to autowire monolog channels.

各チャネルは異なるロガー サービス (monolog.logger.XXX) に対応します。php bin/console debug:container monolog コマンドを使用して、サービスの完全なリストを表示し、モノログ チャネルを自動配線する方法を学習します。

Switching a Channel to a different Handler

Now, suppose you want to log the security channel to a different file. To do this, create a new handler and configure it to log only messages from the security channel. The following example does that only in the prod configuration environment but you can do it in any (or all) environments:

ここで、セキュリティ チャネルを別のファイルに記録するとします。これを行うには、新しいハンドラを作成し、セキュリティ チャネルからのメッセージのみを記録するように設定します。次の例では、prod 構成環境でのみこれを実行しますが、任意の (またはすべての) 環境で実行できます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# config/packages/prod/monolog.yaml
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']

Caution

注意

The channels configuration only works for top-level handlers. Handlers that are nested inside a group, buffer, filter, fingers crossed or other such handler will ignore this configuration and will process every message passed to them.

チャネル構成は、最上位のハンドラーに対してのみ機能します。グループ、バッファ、フィルタ、フィンガー クロスなどのハンドラ内にネストされたハンドラは、この設定を無視し、渡されたすべてのメッセージを処理します。

YAML Specification

You can specify the configuration by many forms:

さまざまな形式で構成を指定できます。
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'

Creating your own Channel

You can change the channel Monolog logs to one service at a time. This is done either via the configuration below or by tagging your service with monolog.logger and specifying which channel the service should log to. With the tag, the logger that is injected into that service is preconfigured to use the channel you've specified.

チャンネル Monolog ログを一度に 1 つのサービスに変更できます。これは、以下の構成を使用するか、サービスに monolog.logger のタグを付けて、サービスがログを記録するチャネルを指定することによって行われます。タグを使用すると、そのサービスに挿入されるロガーは、指定したチャネルを使用するように事前構成されます。

Configure Additional Channels without Tagged Services

You can also configure additional channels without the need to tag your services:

サービスにタグを付けることなく、追加のチャネルを構成することもできます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
# config/packages/prod/monolog.yaml
monolog:
    channels: ['foo', 'bar', 'foo_bar']

Symfony automatically registers one service per channel (in this example, the channel foo creates a service called monolog.logger.foo). In order to inject this service into others, you must update the service configuration to choose the specific service to inject.

symfony は、チャネルごとに 1 つのサービスを自動的に登録します (この例では、チャネル foo は monolog.logger.foo というサービスを作成します)。このサービスを他のサービスに注入するには、サービス構成を更新して、注入する特定のサービスを選択する必要があります。

How to Autowire Logger Channels

Starting from MonologBundle 3.5 you can autowire different Monolog channels by type-hinting your service arguments with the following syntax: Psr\Log\LoggerInterface $<camelCased channel name> + Logger. The <channel> must have been predefined in your Monolog configuration.

MonologBu​​ndle 3.5 以降では、次の構文を使用してサービス引数にタイプヒントを付けることで、さまざまな Monolog チャネルを自動配線できます: Psr\Log\LoggerInterface $ + Logger. Monolog 構成で事前に定義されている必要があります。

For example to inject the service related to the foo_bar logger channel, change your constructor like this:

たとえば、foo_bar ロガー チャネルに関連するサービスを注入するには、コンストラクターを次のように変更します。
1
2
3
4
5
-     public function __construct(LoggerInterface $logger)
+     public function __construct(LoggerInterface $fooBarLogger)
    {
        $this->logger = $fooBarLogger;
    }