日志

在 PHP 程序中进行调试比较常用的方法可能就是直接用 var_dump 将内容输出到页面上进行分析。这种方法会将调试信息与页面内容混在一起,一是不便于分析,再者就是可能会影响页面的正常功能。

Symfony2 中使用了 Monolog 这个 PHP 的日志库,可以用于将日志记录在服务器端。这样将调试信息和页面内容进行分离。

使用方法

框架默认已经注册了一个名为 logger 的服务,使用它进行记录日志信息。例如,在控制器中用法如下:

  1. $logger = $this->get('logger');
  2. $logger->info('I just got the logger');
  3. $logger->error('An error occurred');

以上语句将会向 "%kernel.logs_dir%/%kernel.environment%.log" 文件中分别写入级别为 INFOERROR 的两行内容。如果是开发环境,那么对应的日志文件为: app/logs/dev.log

自定义日志处理

如果打开 app/logs/dev.log 文件会发现它记录了很多内容,这同样不便于我们分析。因此我们需要将我们自己的日志记录到指定的位置。

修改 app/config/config_dev.yml 文件,设置 monologhandlers,新增一项。

  1. monolog:
  2. handlers:
  3. applog:
  4. type: stream
  5. path: /tmp/symfony2.log
  6. level: info

这里我们新建了一个日志处理器,它将只记录 INFO 级别以上的日志并保存在 /tmp/symfony2.log 文件中。

然后在 src/Blogger/BlogBundle/Resources/config/services.yml 文件中进行注册 services:

  1. blogger_blog.applog:
  2. class: Symfony\Bridge\Monolog\Logger
  3. arguments: ["@logger"]
  4. tags:
  5. - { name: monolog.logger, handlers: applog }

最后在控制器中执行:

  1. $logger = $this->get('blogger_blog.applog');
  2. $logger->info('I just got the logger');
  3. $logger->notice("xxxx");
  4. $logger->warning("xxxx");
  5. $logger->error('An error occurred');

现在我们自己的日志将保存在 /tmp/symfony2.log 文件,这样就与框架自己的日志分开了。

查看 /tmp/symfony2.log 文件会发现同样还是存在一些其他的不是我们写入的内容。现在我们想要只记录我们写入的内容,重新修改 app/config/config_dev.yml 文件:

  1. monolog:
  2. handlers:
  3. applog:
  4. type: stream
  5. path: /tmp/symfony2.log
  6. level: info
  7. channels: [applog]
  8. channels: ["applog", "main"]

为日志设置频道,同时再将刚刚在 src/Blogger/BlogBundle/Resources/config/services.yml 文件中注册的 blogger_blog.applog 服务删除掉。

最后在控制器中执行:

  1. $logger = $this->get('monolog.logger.applog');
  2. $logger->info('I just got the logger');
  3. $logger->notice("xxxx");
  4. $logger->warning("xxxx");
  5. $logger->error('An error occurred');

参考文档: http://symfony.com/doc/2.5/cookbook/logging/monolog.html