Logging

Symfony comes with a minimalist PSR-3 logger: Logger. In conformance with the twelve-factor app methodology, it sends messages starting from the WARNING level to stderr.

symfony には最小限の PSR-3 ロガー、Logger が付属しています。12 要素アプリの方法論に準拠して、警告レベルから始まるメッセージを stderr に送信します。

The minimal log level can be changed by setting the SHELL_VERBOSITY environment variable:

最小限のログ レベルは、SHELL_VERBOSITY 環境変数を設定することで変更できます。
SHELL_VERBOSITY value Minimum log level
-1 ERROR
1 NOTICE
2 INFO
3 DEBUG

The minimum log level, the default output and the log format can also be changed by passing the appropriate arguments to the constructor of Logger. To do so, override the "logger" service definition.

最小ログ レベル、デフォルト出力、およびログ形式は、Logger のコンストラクターへの適切な引数をバイパスして変更することもできます。これを行うには、"logger" サービス定義をオーバーライドします。

Logging a Message

To log a message, inject the default logger in your controller or service:

メッセージをログに記録するには、コントローラーまたはサービスにデフォルトのロガーを挿入します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Psr\Log\LoggerInterface;

public function index(LoggerInterface $logger)
{
    $logger->info('I just got the logger');
    $logger->error('An error occurred');

    $logger->critical('I left the oven on!', [
        // include extra "context" info in your logs
        'cause' => 'in_hurry',
    ]);

    // ...
}

The logger service has different methods for different logging levels/priorities. See LoggerInterface for a list of all of the methods on the logger.

ロガー サービスには、ログ レベル/優先度ごとに異なるメソッドがあります。ロガーのすべてのメソッドのリストについては、LoggerInterface を参照してください。

Monolog

Symfony integrates seamlessly with Monolog, the most popular PHP logging library, to create and store log messages in a variety of different places and trigger various actions.

Symfony は、最も人気のある PHP ロギング ライブラリである Monolog とシームレスに統合され、ログ メッセージを作成してさまざまな場所に保存し、さまざまなアクションをトリガーします。

For instance, using Monolog you can configure the logger to do different things based on the level of a message (e.g. send an email when an error occurs).

たとえば、Monolog を使用すると、メッセージのレベルに基づいてさまざまなことを行うようにロガーを構成できます (たとえば、エラーが発生したときに電子メールを送信する)。

Run this command to install the Monolog based logger before using it:

次のコマンドを実行して、Monolog ベースのロガーを使用する前にインストールします。
1
$ composer require symfony/monolog-bundle

The following sections assume that Monolog is installed.

以下のセクションでは、Monolog がインストールされていることを前提としています。

Where Logs are Stored

By default, log entries are written to the var/log/dev.log file when you're in the dev environment.

デフォルトでは、開発環境にいる場合、ログエントリは var/log/dev.log ファイルに書き込まれます。

In the prod environment, logs are written to STDERR PHP stream, which works best in modern containerized applications deployed to servers without disk write permissions.

If you prefer to store production logs in a file, set the path of your log handler(s) to the path of the file to use (e.g. var/log/prod.log).

運用ログをファイルに保存する場合は、ログ ハンドラーのパスを使用するファイルのパスに設定します (例: var/log/prod.log)。

Handlers: Writing Logs to different Locations

The logger has a stack of handlers, and each can be used to write the log entries to different locations (e.g. files, database, Slack, etc).

ロガーにはハンドラーのスタックがあり、それぞれを使用してログ エントリをさまざまな場所 (ファイル、データベース、Slack など) に書き込むことができます。

Tip

ヒント

You can also configure logging "channels", which are like categories. Each channel can have its own handlers, which means you can store different log messages in different places. See How to Log Messages to different Files.

カテゴリのようなログ「チャネル」を構成することもできます。各チャネルは独自のハンドラーを持つことができます。つまり、さまざまなログメッセージをさまざまな場所に保存できます。メッセージを別のファイルに記録する方法を参照してください。

Symfony pre-configures some basic handlers in the default monolog.yaml config files. Check these out for some real-world examples.

Symfony は、デフォルトの monolog.yamlconfig ファイルでいくつかの基本ハンドラーを事前設定します。実際の例については、これらを確認してください。

This example uses two handlers: stream (to write to a file) and syslog to write logs using the syslog function:

この例では、stream (ファイルに書き込む) と syslog の 2 つのハンドラーを使用して、syslog 関数を使用してログを書き込みます。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# config/packages/prod/monolog.yaml
monolog:
    handlers:
        # this "file_log" key could be anything
        file_log:
            type: stream
            # log to var/log/(environment).log
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            # log *all* messages (debug is lowest level)
            level: debug

        syslog_handler:
            type: syslog
            # log error-level messages and higher
            level: error

This defines a stack of handlers and each handler is called in the order that it's defined.

これはハンドラーのスタックを定義し、各ハンドラーは定義された順序で呼び出されます。

Note

ノート

If you want to override the monolog configuration via another config file, you will need to redefine the entire handlers stack. The configuration from the two files cannot be merged because the order matters and a merge does not allow you to control the order.

別の構成ファイルを介して monolog 構成をオーバーライドする場合は、ハンドラー スタック全体を再定義する必要があります。順序が重要であり、マージでは順序を制御できないため、2 つのファイルの構成をマージすることはできません。

Handlers that Modify Log Entries

Instead of writing log files somewhere, some handlers are used to filter or modify log entries before sending them to other handlers. One powerful, built-in handler called fingers_crossed is used in the prod environment by default. It stores all log messages during a request but only passes them to a second handler if one of the messages reaches an action_level. Take this example:

ログ ファイルをどこかに書き込む代わりに、一部のハンドラーを使用して、ログ エントリを他のハンドラーに送信する前にフィルター処理または変更します。デフォルトでは、fingers_crossed という強力な組み込みハンドラーが prod 環境で使用されます。リクエスト中にすべてのログ メッセージを保存しますが、メッセージの 1 つが action_level に達した場合にのみ、2 番目のハンドラに渡します。次の例を見てください。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# config/packages/prod/monolog.yaml
monolog:
    handlers:
        filter_for_errors:
            type: fingers_crossed
            # if *one* log is error or higher, pass *all* to file_log
            action_level: error
            handler: file_log

        # now passed *all* logs, but only if one log is error or higher
        file_log:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"

        # still passed *all* logs, and still only logs error or higher
        syslog_handler:
            type: syslog
            level: error

Now, if even one log entry has an error level or higher, then all log entries for that request are saved to a file via the file_log handler. That means that your log file will contain all the details about the problematic request - making debugging much easier!

これで、ログ エントリが 1 つでもエラー レベル以上の場合、その要求のすべてのログ エントリが file_log ハンドラを介してファイルに保存されます。つまり、問題のあるリクエストに関するすべての詳細がログ ファイルに含まれるので、デバッグがはるかに簡単になります。

Tip

ヒント

The handler named "file_log" will not be included in the stack itself as it is used as a nested handler of the fingers_crossed handler.

「file_log」という名前のハンドラーは、fingers_crossed ハンドラーのネストされたハンドラーとして使用されるため、スタック自体には含まれません。

All Built-in Handlers

Monolog comes with many built-in handlers for emailing logs, sending them to Loggly, or notifying you in Slack. These are documented inside of MonologBundle itself. For a full list, see Monolog Configuration.

Monolog には、ログを電子メールで送信したり、Loggly に送信したり、Slack で通知したりするための多くの組み込みハンドラーが付属しています。これらは、MonologBu​​ndle 自体の内部に文書化されています。完全なリストについては、モノログ構成を参照してください。

How to Rotate your Log Files

Over time, log files can grow to be huge, both while developing and on production. One best-practice solution is to use a tool like the logrotate Linux command to rotate log files before they become too large.

時間の経過とともに、開発中と運用中の両方で、ログ ファイルが巨大になる可能性があります。ベスト プラクティス ソリューションの 1 つは、logrotateLinux コマンドなどのツールを使用して、ログ ファイルが大きくなりすぎる前にローテーションすることです。

Another option is to have Monolog rotate the files for you by using the rotating_file handler. This handler creates a new log file every day and can also remove old files automatically. To use it, set the type option of your handler to rotating_file:

もう 1 つのオプションは、rotating_file ハンドラーを使用して Monolog にファイルをローテーションさせることです。このハンドラーは毎日新しいログ ファイルを作成し、古いファイルを自動的に削除することもできます。これを使用するには、ハンドラーの typeoption をrotating_file に設定します。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
# config/packages/prod/monolog.yaml
monolog:
    handlers:
        main:
            type:  rotating_file
            path:  '%kernel.logs_dir%/%kernel.environment%.log'
            level: debug
            # max number of log files to keep
            # defaults to zero, which means infinite files
            max_files: 10

Using a Logger inside a Service

If your application uses service autoconfiguration, any service whose class implements Psr\Log\LoggerAwareInterface will receive a call to its method setLogger() with the default logger service passed as a service.

アプリケーションがサービスの自動構成を使用する場合、クラスが Psr\Log\LoggerAwareInterface を実装するサービスは、サービスとして渡されたデフォルトのロガー サービスを使用して、そのメソッド setLogger() への呼び出しを受け取ります。

If you want to use in your own services a pre-configured logger which uses a specific channel (app by default), you can either autowire monolog channels or use the monolog.logger tag with the channel property as explained in the Dependency Injection reference.

独自のサービスで、特定のチャネル (デフォルトではアプリ) を使用する事前構成済みのロガーを使用する場合は、モノログ チャネルを自動配線するか、依存性注入のリファレンスで説明されているようにチャネル プロパティで monolog.logger タグを使用できます。

Adding extra Data to each Log (e.g. a unique request token)

Monolog also supports processors: functions that can dynamically add extra information to your log entries.

Monolog はプロセッサもサポートしています。これは、ログ エントリに追加情報を動的に追加できる関数です。

See How to Add extra Data to Log Messages via a Processor for details.

詳細については、「プロセッサを介してログ メッセージに追加データを追加する方法」を参照してください。

Learn more