日志记录(Logging)

Phalcon提供了一个日志记录组件即 Phalcon\Logger。 我们可以使用此组件输出日志到不同的流中,如文件,系统日志等。 这个组件还提供了其它的功能如日志事务(类似于数据库的事务), 配置选项, 还可以输出不同的格式,另外还支持多种过滤器。 Phalcon\Logger 提供了多种日志记录方式,从调试程序到跟踪应用的执行以满足应用的需求。

适配器(Adapters)

此组件使用不同的流适配器来保存日信息。 我们可以按需使用适配器。支持的适配器如下:

适配器描述
Phalcon\Logger\Adapter\File保存日志到普通文件
Phalcon\Logger\Adapter\Stream保存日志到PHP流
Phalcon\Logger\Adapter\Syslog保存到系统日志
Phalcon\Logger\Adapter\FirePHP发送日志到FirePHP

创建日志(Creating a Log)

下面的例子展示了如何创建日志对象及如何添加日志信息:

  1. <?php
  2. use Phalcon\Logger;
  3. use Phalcon\Logger\Adapter\File as FileAdapter;
  4. $logger = new FileAdapter("app/logs/test.log");
  5. // These are the different log levels available:
  6. $logger->critical(
  7. "This is a critical message"
  8. );
  9. $logger->emergency(
  10. "This is an emergency message"
  11. );
  12. $logger->debug(
  13. "This is a debug message"
  14. );
  15. $logger->error(
  16. "This is an error message"
  17. );
  18. $logger->info(
  19. "This is an info message"
  20. );
  21. $logger->notice(
  22. "This is a notice message"
  23. );
  24. $logger->warning(
  25. "This is a warning message"
  26. );
  27. $logger->alert(
  28. "This is an alert message"
  29. );
  30. // You can also use the log() method with a Logger constant:
  31. $logger->log(
  32. "This is another error message",
  33. Logger::ERROR
  34. );
  35. // If no constant is given, DEBUG is assumed.
  36. $logger->log(
  37. "This is a message"
  38. );
  39. // You can also pass context parameters like this
  40. $logger->log(
  41. "This is a {message}",
  42. [
  43. 'message' => 'parameter'
  44. ]
  45. );

产生的日志信息如下:

  1. [Tue, 28 Jul 15 22:09:02 -0500][CRITICAL] This is a critical message
  2. [Tue, 28 Jul 15 22:09:02 -0500][EMERGENCY] This is an emergency message
  3. [Tue, 28 Jul 15 22:09:02 -0500][DEBUG] This is a debug message
  4. [Tue, 28 Jul 15 22:09:02 -0500][ERROR] This is an error message
  5. [Tue, 28 Jul 15 22:09:02 -0500][INFO] This is an info message
  6. [Tue, 28 Jul 15 22:09:02 -0500][NOTICE] This is a notice message
  7. [Tue, 28 Jul 15 22:09:02 -0500][WARNING] This is a warning message
  8. [Tue, 28 Jul 15 22:09:02 -0500][ALERT] This is an alert message
  9. [Tue, 28 Jul 15 22:09:02 -0500][ERROR] This is another error message
  10. [Tue, 28 Jul 15 22:09:02 -0500][DEBUG] This is a message
  11. [Tue, 28 Jul 15 22:09:02 -0500][DEBUG] This is a parameter

You can also set a log level using the setLogLevel() method. This method takes a Logger constant and will only save log messages that are as important or more important than the constant:

  1. <?php
  2. use Phalcon\Logger;
  3. use Phalcon\Logger\Adapter\File as FileAdapter;
  4. $logger = new FileAdapter("app/logs/test.log");
  5. $logger->setLogLevel(
  6. Logger::CRITICAL
  7. );

In the example above, only critical and emergency messages will get saved to the log. By default, everything is saved.

事务(Transactions)

保存日志到适配器如文件(文件系统)是非常消耗系统资源的。 为了减少应用性能上的开销,我们可以使用日志事务。 事务会把日志记录临时的保存到内存中然后再 写入到适配中(此例子中为文件),(这个操作是个原子操作)

  1. <?php
  2. use Phalcon\Logger\Adapter\File as FileAdapter;
  3. // 生成日志新组件实例
  4. $logger = new FileAdapter("app/logs/test.log");
  5. // 开启事务
  6. $logger->begin();
  7. // 添加消息
  8. $logger->alert(
  9. "This is an alert"
  10. );
  11. $logger->error(
  12. "This is another error"
  13. );
  14. // 保存消息到文件中
  15. $logger->commit();

使用多个处理程序进行日志记录(Logging to Multiple Handlers)

Phalcon\Logger 也可以同时保存日志信息到多个适配器中:

  1. <?php
  2. use Phalcon\Logger;
  3. use Phalcon\Logger\Multiple as MultipleStream;
  4. use Phalcon\Logger\Adapter\File as FileAdapter;
  5. use Phalcon\Logger\Adapter\Stream as StreamAdapter;
  6. $logger = new MultipleStream();
  7. $logger->push(
  8. new FileAdapter("test.log")
  9. );
  10. $logger->push(
  11. new StreamAdapter("php://stdout")
  12. );
  13. $logger->log(
  14. "This is a message"
  15. );
  16. $logger->log(
  17. "This is an error",
  18. Logger::ERROR
  19. );
  20. $logger->error(
  21. "This is another error"
  22. );

信息发送的顺序和处理器(适配器)注册的顺序相同。

信息格式(Message Formatting)

此组件使用 formatters 在信息发送前格式化日志信息。 支持下而后格式:

适配器描述
Phalcon\Logger\Formatter\Line文本方式格式化信息
Phalcon\Logger\Formatter\FirephpFormats the messages so that they can be sent to FirePHP
Phalcon\Logger\Formatter\Json使用JSON格式格式化信息
Phalcon\Logger\Formatter\Syslog使用系统提供的格式格式化信息

行格式化处理(Line Formatter)

使用单行格式格式化信息。 默认的格式如下:

  1. [%date%][%type%] %message%

我们可以使用 setFormat() 来设置自定义格式。 下面是格式变量:

变量描述
%message%待记录的日志消息
%date%消息添加的时间
%type%消息类型(使用大写)

下面的例子中展示了如何修改日志格式:

  1. <?php
  2. use Phalcon\Logger\Formatter\Line as LineFormatter;
  3. $formatter = new LineFormatter("%date% - %message%");
  4. // 修改日志格式
  5. $logger->setFormatter($formatter);

自定义格式处理(Implementing your own formatters)

若要实现自定义的格式则要实现 Phalcon\Logger\FormatterInterface 接口, 这样才能扩展已有的格式或创建自定义的格式

适配器(Adapters)

下面的例子中展示了每种适配器的简单用法:

数据流日志记录器(Stream Logger)

系统日志保存消息到一个已注册的有效的PHP流中。 这里列出了可用的流: here <http://php.net/manual/en/wrappers.php>`_:

  1. <?php
  2. use Phalcon\Logger\Adapter\Stream as StreamAdapter;
  3. // 使用zlib压缩流
  4. $logger = new StreamAdapter("compress.zlib://week.log.gz");
  5. // 发送消息到stderr
  6. $logger = new StreamAdapter("php://stderr");

文件日志记录器(File Logger)

文件适配器保存所有的日志信息到普通的文件中。 默认情况下日志文件使用添加模式打开,打开文件后文件的指针会指向文件的尾端。 如果文件不存在,则会尝试创建。 我们可以通过传递附加参数的形式来修改打开的模式:

  1. <?php
  2. use Phalcon\Logger\Adapter\File as FileAdapter;
  3. // 使用写模式打开
  4. $logger = new FileAdapter(
  5. "app/logs/test.log",
  6. [
  7. "mode" => "w",
  8. ]
  9. );

Syslog 日志记录器(Syslog Logger)

使用系统日志适配器。 由于操作系统的不同得到的日志也不尽相同:

  1. <?php
  2. use Phalcon\Logger\Adapter\Syslog as SyslogAdapter;
  3. // 基本用法
  4. $logger = new SyslogAdapter(null);
  5. // Setting ident/mode/facility 参数设置
  6. $logger = new SyslogAdapter(
  7. "ident-name",
  8. [
  9. "option" => LOG_NDELAY,
  10. "facility" => LOG_MAIL,
  11. ]
  12. );

FirePHP 日志记录器(FirePHP Logger)

This logger sends messages in HTTP response headers that are displayed by FirePHP, a Firebug extension for Firefox.

  1. <?php
  2. use Phalcon\Logger;
  3. use Phalcon\Logger\Adapter\Firephp as Firephp;
  4. $logger = new Firephp("");
  5. $logger->log(
  6. "This is a message"
  7. );
  8. $logger->log(
  9. "This is an error",
  10. Logger::ERROR
  11. );
  12. $logger->error(
  13. "This is another error"
  14. );

自定义适配器(Implementing your own adapters)

如果开发者想自定义新的日志组件则需实现此接口: Phalcon\Logger\AdapterInterface