로깅에 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.ymlconfig_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.ymlconfig_prod. yml.

dev 환경에 있을 때 로그 파일 항목은 var/logs/dev.log 파일에 기록됩니다. 기본적으로. prod 환경에서는 로그가 var/logs/prod.log에 기록되지만 요청 프로세스 중에만 오류가 발생하거나 우선순위가 높은 로그(예: error(), important())가 발생한 경우에만 발생합니다. , < code class="notranslate">alert() 또는 emergency()). 저장 위치를 ​​제어하려면 다양한 핸들러(컨트롤러)를 구성하여 로그 진입점(항목)을 제어하고 필요한 경우 수정한 후 최종적으로 저장합니다. Handlers: 다른 위치에 로그 쓰기

logger에는 🎜handlers🎜 세트가 함께 제공되며, 각 핸들러는 로그 항목을 다른 위치(예: 파일, 데이터베이스, Slack 등)에 쓰는 데 사용됩니다. 🎜🎜🎜🎜당신도 🎜또한🎜 카테고리와 유사한 로그의 "채널"을 구성할 수 있습니다. 각 채널에는 🎜자체🎜 핸들러가 있을 수 있습니다. 즉, 다양한 정보를 다양한 위치에 기록할 수 있습니다. 🎜🎜로그 정보를 다른 파일에 쓰는 방법🎜🎜을 참조하세요. 🎜🎜🎜

Symfony에는 config_dev.ymlconfig_prod.yml 파일에 미리 설정된 처리기가 있습니다. 실제 사용 사례를 보려면 확인해 보세요. config_dev.ymlconfig_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: 10
rrreee
이 예에서는 정의된 순서대로 호출되는 세트 핸들러를 정의합니다.
🎜

로그 항목을 수정할 수 있는 핸들러는

🎜로그를 작성하지 않습니다. 파일 어딘가에 있으면 일부 핸들러를 사용하여 로그를 다른 핸들러로 보내기 전에 로그를 필터링하고 수정할 수 있습니다. 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
을 사용하는 것입니다.