로깅에 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', )); // ...}
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: error다양한 로그 수준/우선순위에 대한 로거 서비스 다른 접근 방식. 메시지 수준에 따라 다양한 작업을 수행하도록 로거를 구성할 수 있습니다(예: 오류 발생 시 이메일 보내기).
로거 메소드의 전체 목록은 참조LoggerInterface를 참조하세요. .
로그 저장 위치 ¶
로그 저장을 위한 구성 정보여기는 특정 < a class="referenceternal" href="configuration/environments.html">environment
config_dev.yml
및 config_prod. yml
. dev
환경에 있을 때 로그 파일 항목은 var/logs/dev.log
파일에 기록됩니다. 기본적으로. prod
환경에서는 로그가 var/logs/prod.log
에 기록되지만 요청 프로세스 중에만 오류가 발생하거나 우선순위가 높은 로그(예: error()
, important()
)가 발생한 경우에만 발생합니다. , < code class="notranslate">alert() 또는 emergency()
). 저장 위치를 제어하려면 다양한 핸들러(컨트롤러)를 구성하여 로그 진입점(항목)을 제어하고 필요한 경우 수정한 후 최종적으로 저장합니다. Handlers: 다른 위치에 로그 쓰기 ¶
Symfony에는 config_dev.yml
및 config_prod.yml
파일에 미리 설정된 처리기가 있습니다. 실제 사용 사례를 보려면 확인해 보세요. 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
(파일 쓰기용)과 syslog
를 사용합니다. 후자는 syslog를 사용합니다.
함수를 사용하여 로그를 완성합니다. 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
🎜
로그 항목을 수정할 수 있는 핸들러는 ¶
🎜로그를 작성하지 않습니다. 파일 어딘가에 있으면 일부 핸들러를 사용하여 로그를 다른 핸들러로 보내기 전에 로그를 필터링하고 수정할 수 있습니다.fingers_crossed
라는 강력한 내장 핸들러가 prod
환경에서 기본적으로 사용됩니다. 요청 프로세스 중에 모든 로그 정보를 저장하지만, 정보의 일부가 action_level< /에 도달하면 단지 이를 두 번째 처리기로 전달합니다. 코드> 레벨. 다음 루틴을 살펴보세요.🎜rrreeerrreeerrreee🎜이제 로그 항목(로그 항목, 번역: "어딘가에 있는 로그 파일")에 오류
이상(정보)이 발생하면 < 요청의 em>모든 로그 항목은 file_log
처리기를 통해 파일에 저장됩니다. 즉, 로그 파일에 문제가 있는 요청과 관련된 모든 세부 정보가 포함되므로 디버깅이 훨씬 쉬워집니다!
🎜"file_log"라는 핸들러는 컨트롤러 스택의 컨트롤은 fingers_crossed
핸들러의 중첩 컨트롤러로 사용되기 때문입니다. 🎜🎜🎜
다른 구성 파일을 통해 재정의하려는 경우monolog
구성 정보를 보려면 전체 핸들러
스택(컨트롤러 스택)을 다시 정의해야 합니다. 처리기의 순서가 중요하고 일단 병합되면 순서를 제어할 수 없기 때문에 이 두 파일의 구성 정보를 병합할 수 없습니다. 🎜🎜🎜
모든 내장 핸들러 ¶
Monolog에는 로그 이메일을 보내거나, Loggly로 보내거나, Slack에서 알림을 보내기 위한 다양한 핸들러가 함께 제공됩니다. 이러한 기능은 MonologBundle에 문서화되어 있습니다. 전체 목록은 Monolog 구성을 참조하세요.
로그 파일을 뒤집는 방법 ¶
시간이 지남에 따라 개발 환경이든 프로덕션 환경이든 로그 파일은 매우 거대해집니다. 솔루션의 가장 좋은 방법은 logrotate와 같은 Linux 명령을 사용하여 로그 파일이 커지기 전에 되돌리는 것입니다.
또 다른 옵션은 rotating_file
handler来令Monolog去反转日志文件。这个控制器每天会创建新的日志文件,并自动删除旧的。要使用它,把控制器中的 type
选项设为 rotating_file
:
rrreeerrreeerrreee을 사용하는 것입니다.