ログ記録には 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 ハンドラーがあります。これらの関数は MonologBundle に文書化されています。完全なリストについては、モノログ構成を参照してください。
ログ ファイルを反転する方法 ¶
開発環境であっても運用環境であっても、時間の経過とともにログ ファイルは 非常に巨大になります 。このソリューションのベスト プラクティスは、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