Gunakan Monolog untuk pembalakan


Symfony dilengkapi dengan perpustakaan luaran - dipanggil Monolog - yang membolehkan anda membuat log yang boleh disimpan di pelbagai tempat yang berbeza.

Rakam mesej

Untuk merekod mesej, alih keluar perkhidmatan logger daripada bekas dalam pengawal: 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

perkhidmatan logger untuk tahap/keutamaan log yang berbeza Ada pendekatan yang berbeza. Anda boleh mengkonfigurasi logger untuk melakukan perkara yang berbeza berdasarkan tahap mesej (seperti menghantar e-mel apabila ralat berlaku).

RujukanLoggerInterface untuk senarai lengkap kaedah pembalak .

Di mana log disimpan

Maklumat konfigurasi untuk menyimpan log

di mana terletak dalam < khusus a class="reference internal" href="configuration/environments.html">environment

Fail konfigurasi: config_dev.yml dan config_prod. yml.

Apabila anda berada dalam persekitaran dev, kemasukan fail log ditulis ke dalam fail var/logs/dev.log secara lalai. Dalam persekitaran prod, log ditulis kepada var/logs/prod.log, tetapi hanya semasa proses permintaan Ia hanya akan berlaku apabila ralat ditemui atau log keutamaan tinggi ditemui (seperti error(), critical() , < code class="notranslate">alert() atau kecemasan()). Untuk mengawal lokasi storan, anda mengkonfigurasi pengendali (pengawal) berbeza untuk mengawal titik masuk log (entri), mengubah suainya jika perlu, dan akhirnya menyimpannya. Pengendali: Tulis log ke lokasi yang berbeza

logger disertakan dengan set 🎜pengendali🎜, setiap satunya digunakan untuk menulis entri log ke lokasi yang berbeza (seperti fail, pangkalan data, Slack, dll. ). 🎜🎜🎜🎜Anda 🎜juga🎜 boleh mengkonfigurasi "saluran" log, yang seperti kategori. Setiap saluran boleh mempunyai 🎜sendiri🎜 pengendalinya, yang bermaksud anda boleh log maklumat yang berbeza ke tempat yang berbeza. Rujuk 🎜🎜Cara menulis maklumat log ke dalam fail yang berbeza🎜🎜. 🎜🎜🎜

Symfony mempunyai beberapa pengendali pratetap dalam fail config_dev.yml dan config_prod.yml. Semak mereka untuk melihat kes penggunaan dunia sebenar. 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

Contoh berikut menggunakan dua pengendali: strim (untuk menulis fail) dan syslog, yang terakhir menggunakan syslog Fungsi untuk melengkapkan 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: 10
rrreee
Contoh ini mentakrifkan set pengendali, yang akan dipanggil mengikut susunan ia ditakrifkan.
🎜

Pengendali yang boleh mengubah suai entri log

🎜jangan tulis log di suatu tempat fail, beberapa pengendali boleh digunakan untuk menapis dan mengubah suai log sebelum menghantarnya kepada pengendali lain. Pengendali terbina dalam yang berkuasa bernama fingers_crossed digunakan secara lalai dalam persekitaran prod. Ia menyimpan semua maklumat log semasa proses permintaan, tetapi hanya menyerahkannya kepada pengendali kedua Jika sekeping maklumat mencapai action_level tahap. Lihat rutin berikut:🎜rrreeerrreeerrreee🎜Sekarang, jika entri log (masukan log, terjemahan: "fail log terletak di suatu tempat") menemui ralat atau lebih tinggi (maklumat), maka < em>semua entri log permintaan akan disimpan ke dalam fail melalui pengendali file_log. Ini bermakna fail log anda akan mengandungi semua butiran berkaitan permintaan bermasalah - menjadikan penyahpepijatan lebih mudah!
🎜

Pengendali bernama "file_log" tidak akan disertakan dalam kawalan dalam tindanan pengawal kerana ia digunakan sebagai pengawal bersarang pengendali fingers_crossed. 🎜🎜🎜

Jika anda ingin mengatasinya melalui fail konfigurasi lainmonolog, anda perlu mentakrifkan semula keseluruhan timbunan pengendali (timbunan pengawal). Maklumat konfigurasi dalam kedua-dua fail ini tidak boleh digabungkan kerana susunan (pengendali) adalah kritikal dan susunan tidak boleh dikawal setelah digabungkan. 🎜🎜🎜

Semua pengendali terbina dalam

Monolog disertakan dengan banyak pengendali untuk menghantar e-mel log, menghantarnya ke Loggly atau memberitahu anda dalam Slack. Fungsi ini didokumenkan dalam MonologBundle. Sila rujuk Konfigurasi Monolog untuk senarai lengkap.

Cara menyelak fail log anda

Lama kelamaan, sama ada persekitaran pembangunan atau persekitaran pengeluaran, fail log akan menjadi sangat besar. Amalan terbaik dalam penyelesaian adalah menggunakan arahan Linux seperti logrotate untuk membalikkan fail log sebelum ia menjadi besar.

Pilihan lain adalah dengan hanya menggunakan rotating_file handler来令Monolog去反转日志文件。这个控制器每天会创建新的日志文件,并自动删除旧的。要使用它,把控制器中的 type 选项设为 rotating_file:

rrreeerrreeerrreee