ログ記録には Monolog を使用する


Symfony には、Monolog と呼ばれる外部ライブラリが付属しており、さまざまな場所に保存できるログを作成できます。

メッセージを記録する

メッセージを記録するには、コントローラーのコンテナーから logger サービスを削除します:

public function indexAction(){
    $logger = $this->get('logger');
    $logger->info('I just got the logger');
    $logger->error('An error occurred');     $logger->critical('I left the oven on!', array(
        // include extra "context" info in your logs / 在日志中附带额外的“上下文”信息
        'cause' => 'in_hurry',
    ));     // ...}

ロガー サービスには、さまざまなログ レベル/優先度に応じてさまざまな方法があります。メッセージのレベルに基づいてさまざまな動作を実行するようにロガーを構成できます (エラー発生時の電子メールの送信など)。

ロガー メソッドの完全なリストについては、LoggerInterface を参照してください。

ログの保存場所

ログを保存するための構成情報 どこは特定の # にあります。 ##environment 構成ファイル: config_dev.yml および config_prod.yml

dev 環境にいる場合、ログ ファイル エントリはデフォルトで var/logs/dev.log ファイルに書き込まれます。 prod 環境では、ログは var/logs/prod.log に書き込まれますが、only でエラーが発生するか、優先度の高いログが記録される場合にのみ発生します。 (error()critical()alert()emergency() など)。

保存場所を制御するには、さまざまな

ハンドラー (コントローラー) を構成してログ エントリ ポイント (エントリ) を制御し、必要に応じて変更し、最後に保存する必要があります。

ハンドラー: ログをさまざまな場所に書き込みます

ロガーには、一連の

ハンドラーが付属しており、それぞれがログの書き込みに使用されます。エントリは次のとおりです。異なる場所 (ファイル、データベース、Slack など) に書き込まれます。

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

Symfony は、config_dev.yml および config_prod.yml ファイルにいくつかのハンドラーをプリセットします。実際の使用例を確認するには、これらをチェックしてください。

次の例では、2 つの ハンドラーを使用します: stream (ファイルの書き込み用) と syslog、後者は syslog を使用します。 ログを完成させる関数:

YAML:# app/config/config.ymlmonolog:
    handlers:        # this "file_log" key could be anything
        # 这个 "file_log" 键可以是任何(合法)字符
        file_log:
            type: stream            # log to var/logs/(environment).log
            # 写入到 var/logs/(environment).log
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            # log *all* messages (debug is lowest level)
            # 把 *全部* 信息写入(debug是最低级别)
            level: debug
        syslog_handler:
            type: syslog            # log error-level messages and higher
            # 记录 error-level(ERROR级别)或更高级别(的信息)
            level: error
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:monolog="http://symfony.com/schema/dic/monolog"    xsi:schemaLocation="http://symfony.com/schema/dic/services        http://symfony.com/schema/dic/services/services-1.0.xsd        http://symfony.com/schema/dic/monolog        http://symfony.com/schema/dic/monolog/monolog-1.0.xsd">     <monolog:config>
        <monolog:handler            name="file_log"            type="stream"            path="%kernel.logs_dir%/%kernel.environment%.log"            level="debug"        />
        <monolog:handler            name="syslog_handler"            type="syslog"            level="error"        />
    </monolog:config></container>
PHP:// app/config/config.php$container->loadFromExtension('monolog', array(
    'handlers' => array(
        'file_log' => array(
            'type'  => 'stream',
            'path'  => '%kernel.logs_dir%/%kernel.environment%.log',
            'level' => 'debug',
        ),
        'syslog_handler' => array(
            'type'  => 'syslog',
            'level' => 'error',
        ),
    ),));

この例では、 ハンドラーの グループを定義します。これらのハンドラーは、定義された順序で呼び出されます。

ログ エントリを変更できるハンドラー

ログをファイルに書き込む代わりに、一部の ハンドラーを使用できます。 to "in 他の ハンドラーにログを送信する前に、ログをフィルターして変更します。 fingers_crossed という名前の組み込みの強力なハンドラーが、prod 環境でデフォルトで使用されます。リクエスト プロセス中に all ログ情報を保存しますが、情報の一部が action_level レベルに達すると、only が 2 番目のハンドラーにそれらの情報を渡します。次のルーチンを見てください:

YAML:# app/config/config.ymlmonolog:
    handlers:
        filter_for_errors:
            type: fingers_crossed            # if *one* log is error or higher, pass *all* to file_log
            # 如果 *一条* 日志是error或更高(的级别),把它们 *全部* 传入file_log
            action_level: error
            handler: file_log
         # now passed *all* logs, but only if one log is error or higher
        # 现在传入了 *全部* 日志,但只是那些error或更高级别的
        file_log:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"         # still passed *all* logs, and still only logs error or higher
        # 仍然传入了 *全部* 日志,并且仍然都是error或更高级别的
        syslog_handler:
            type: syslog
            level: error
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:monolog="http://symfony.com/schema/dic/monolog"    xsi:schemaLocation="http://symfony.com/schema/dic/services        http://symfony.com/schema/dic/services/services-1.0.xsd        http://symfony.com/schema/dic/monolog        http://symfony.com/schema/dic/monolog/monolog-1.0.xsd">     <monolog:config>
        <monolog:handler            name="filter_for_errors"            type="fingers_crossed"            action-level="error"            handler="file_log"        />
        <monolog:handler            name="file_log"            type="stream"            path="%kernel.logs_dir%/%kernel.environment%.log"            level="debug"        />
        <monolog:handler            name="syslog_handler"            type="syslog"            level="error"        />
    </monolog:config></container>
PHP:// app/config/config.php$container->loadFromExtension('monolog', array(
    'handlers' => array(
        'filter_for_errors' => array(
            'type'         => 'fingers_crossed',
            'action_level' => 'error',
            'handler'      => 'file_log',
        ),
        'file_log' => array(
            'type'  => 'stream',
            'path'  => '%kernel.logs_dir%/%kernel.environment%.log',
            'level' => 'debug',
        ),
        'syslog_handler' => array(
            'type'  => 'syslog',
            'level' => 'error',
        ),
    ),));

さて、ログ エントリ (ログ エントリ、翻訳注釈:「どこかにあるログ ファイル」) で error 以上のレベル (情報) が発生した場合、その後、リクエストの すべての ログ エントリが、file_log ハンドラーを通じてファイルに保存されます。これは、問題のあるリクエストの all 関連詳細がログ ファイルに含まれることを意味します。これにより、デバッグがはるかに簡単になります。

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

別の構成ファイルを通じて monolog 構成情報を上書きする場合は、handlers## 全体を再定義する必要があります。 #スタック(コントローラースタック)。これら 2 つのファイル内の構成情報は、(ハンドラーの) 順序が重要であり、一度マージすると順序を制御できないため、マージできません。

すべての組み込みハンドラー

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

ログ ファイルを反転する方法

開発環境であっても運用環境であっても、時間の経過とともにログ ファイルは 非常に巨大になります 。このソリューションのベスト プラクティスは、logrotate などの Linux コマンドを使用して、ログ ファイルが巨大になる前に元に戻すことです。

もう 1 つのオプションは、rotating_file ハンドラーを使用して Monolog にログ ファイルを回転するように指示することです。このコントローラーは毎日新しいログ ファイルを作成し、古いログ ファイルを自動的に削除します。これを使用するには、コントローラーの type オプションを rotating_file:

PHP:// app/config/config_dev.php$container->loadFromExtension('monolog', array(
    'handlers' => array(
        'main' => array(
            '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,
        ),
    ),));
XAML:<!-- app/config/config_dev.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:monolog="http://symfony.com/schema/dic/monolog"    xsi:schemaLocation="http://symfony.com/schema/dic/services        http://symfony.com/schema/dic/services/services-1.0.xsd        http://symfony.com/schema/dic/monolog        http://symfony.com/schema/dic/monolog/monolog-1.0.xsd">     <monolog:config>
        <!-- "max_files": max number of log files to keep             defaults to zero, which means infinite files -->
        <monolog:handler name="main"            type="rotating_file"            path="%kernel.logs_dir%/%kernel.environment%.log"            level="debug"            max_files="10"        />
    </monolog:config></container>
YAML:# app/config/config_dev.ymlmonolog:
    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
に設定します。