Utiliser Monolog pour la journalisation
Symfony est livré avec une bibliothèque externe - appelée Monolog - qui vous permet de créer des journaux pouvant être stockés dans une variété d'endroits différents.
Enregistrer un message ¶
Pour enregistrer un message, supprimez le service logger
du conteneur dans le contrôleur : 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', )); // ...}
logger 服务针对不同的日志等级/优先级拥有不同的方法。你可以基于信息的 等级 来配置logger去做不同的事(如 有错误发生时发送邮件)。
参考 LoggerInterface 以了解logger的全部方法列表。
日志被存在哪里 ¶
对于把日志存放于 何处 的配置信息,位于特定的 environment 配置文件: config_dev.yml
和 config_prod.yml
之中。
当你处于 dev
环境时,日志文件入口被默认写进了 var/logs/dev.log
文件。在 prod
环境下,日志被写入 var/logs/prod.log
,但却 仅 在请求过程中遇到错误或是遇到高优先级日志时才会发生(如 error()
, critical()
, alert()
或 emergency()
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: errorservice logger pour différents niveaux/priorités de journalisation différentes approches. Vous pouvez configurer l'enregistreur pour qu'il fasse différentes choses en fonction du niveau du message (comme envoyer un e-mail lorsqu'une erreur se produit).
RéférenceLoggerInterface pour une liste complète des méthodes d'enregistrement .
Où le journal est stocké ¶
Les informations de configuration pour stocker le journaloù se trouvent dans un < spécifique a class="reference internal" href="configuration/environments.html">environment
config_dev.yml
et config_prod. yml
. Lorsque vous êtes dans l'environnement dev
, l'entrée du fichier journal est écrite dans le fichier var/logs/dev.log
par défaut. Dans l'environnement prod
, le journal est écrit dans var/logs/prod.log
, mais seulement pendant le processus de requête. ne se produira que lorsqu'une erreur est rencontrée ou qu'un journal de haute priorité est rencontré (tel que error()
, critical()
, alert()
ou emergency()
). Pour contrôler l'emplacement de stockage, vous configurez différents handlers (contrôleurs) pour contrôler les points d'entrée du journal (entrées), les modifier si nécessaire, et enfin les stocker. Gestionnaires : Écrivez des journaux dans différents emplacements ¶
Symfony a des gestionnaires prédéfinis dans les fichiers config_dev.yml
et config_prod.yml
. Consultez-les pour voir des cas d’utilisation réels. config_dev.yml
和 config_prod.yml
文件中预置了一些handlers。要了解真实用例不妨查看它们。
下例使用了 两个 handlers: stream
(用于写入文件) 和 syslog
,后者使用 syslog
函数来完成日志:
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', ), ),));
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
本例定义了一 组 handler,它们会按照各自被定义的顺序被调用。
可修改日志入口的handlers ¶
并非将日志写入某处的文件, 一些 handlers可用于“在将日志发送到 其他 handlers之前”过滤和修改它们。一个内置的名为 fingers_crossed
的强大handleris默认用于 prod
环境下。它在请求过程中存储 全部 日志信息,却 只是 将它们传入第二个handler,如果某条信息达到 action_level
级别的话。看以下例程:
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', ), ),));
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, ), ),));
现在,如果某一日志入口(log entry,译注:即“位于某处的日志文件”)遇到了 error
或更高级别的(信息),则该请求的 所有 日志入口将通过 file_log
handler被存成一个文件。这意味着你的日志文件将包含问题请求的 全部 相关细节 - 这令调试变得更容易!
名为 "file_log" 的handler将不包括在控制器堆栈中,因为它是作为 fingers_crossed
handler的嵌套控制器来使用。
如果你希望通过另一个配置文件来覆写 monolog
配置信息,你需要重新定义整个 handlers
stream
(pour l'écriture de fichiers) et syslog
, le ce dernier utilise syslog< /a>
pour compléter le log : 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: 10rrreee
🎜
Les gestionnaires qui peuvent modifier l'entrée du journal ¶
🎜n'écrivent pas le journal quelque part dans les fichiers, certains gestionnaires peuvent être utilisés pour filtrer et modifier les journaux avant de les envoyer à autres gestionnaires. Un puissant gestionnaire intégré nomméfingers_crossed
est utilisé par défaut dans l'environnement prod
. Il stocke toutes les informations du journal pendant le processus de requête, mais juste les transmet au deuxième gestionnaire si une information atteint action_level< /. code> niveau. Regardez la routine suivante :🎜rrreeerrreeerrreee🎜Maintenant, si une entrée de journal (entrée de journal, traduction : "fichier journal situé quelque part") rencontre une erreur
ou supérieure (information), alors < em>toutes les entrées du journal de la requête seront enregistrées dans un fichier via le gestionnaire file_log
. Cela signifie que vos fichiers journaux contiendront tous les détails pertinents de la requête problématique, ce qui rendra le débogage beaucoup plus facile !
🎜Le gestionnaire nommé "file_log" ne sera pas inclus dans le control dans la pile de contrôleurs car il est utilisé comme contrôleur imbriqué du gestionnaire fingers_crossed
. 🎜🎜🎜
Si vous souhaitez le remplacer via un autre fichier de configurationmonolog
informations de configuration, vous devez redéfinir l'intégralité de la pile de gestionnaires
(pile de contrôleur). Les informations de configuration dans ces deux fichiers ne peuvent pas être fusionnées car l'ordre (des gestionnaires) est critique et l'ordre ne peut pas être contrôlé une fois fusionné. 🎜🎜🎜
Tous les gestionnaires intégrés ¶
Monolog est livré avec de nombreux gestionnaires pour envoyer des e-mails de journaux, les envoyer à Loggly ou vous avertir dans Slack. Ces fonctions sont documentées dans le MonologBundle. Veuillez vous référer à Configuration Monolog pour la liste complète.
Comment retourner vos fichiers journaux ¶
Au fil du temps, qu'il s'agisse d'un environnement de développement ou d'un environnement de production, les fichiers journaux deviendront extrêmement énormes. Une bonne pratique dans la solution consiste à utiliser une commande Linux telle que logrotate pour inverser les fichiers journaux avant qu'ils ne deviennent énormes.
Une autre option consiste simplement à utiliser rotating_file
handler来令Monolog去反转日志文件。这个控制器每天会创建新的日志文件,并自动删除旧的。要使用它,把控制器中的 type
选项设为 rotating_file
:
rrreeerrreeerrreee