本文制定了日志类库的通用接口规范。
本规范的主要目的,是为了让日志类库以简单通用的方式,通过接收一个 Psr\Log\LoggerInterface 对象,来记录日志信息。 框架以及 CMS 内容管理系统如有需要,可以 对此接口进行扩展,但需遵循本规范,
这才能保证在使用第三方的类库文件时,日志接口仍能正常对接。 本文中的 必须,不得,需要,应,不应,应该,不应该,推荐,可以 和 可选 等能愿动词按照 RFC 2119 中的描述进行解释。
本文档中的 implementor 一词应理解为在日志的库中实现 LoggerInterface 的人。记录器的调用者称为 user。
LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency。
log,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须 与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,则 必须 抛出 Psr\Log\InvalidArgumentException 类型的异常。在不确定的情况下,使用者 不应该 使用未支持的等级常量来调用此方法。
以上每个方法都接受一个字符串类型或者是有 __toString() 方法的对象作为记录信息参数,这样,实现者就能把它当成字符串来处理,否则实现者 必须 自己把它转换成字符串。
记录信息参数 可以 携带占位符,实现者 可以 根据上下文将其它替换成相应的值。
其中占位符 必须 与上下文数组中的键名保持一致。
占位符的名称 必须 由一个左花括号 { 以及一个右括号 } 包含。但花括号与名称之间 不得 有空格符。
占位符的名称 应该 只由 A-Z、a-z、0-9、下划线 _、以及英文的句号 . 组成,其它字符作为将来占位符规范的保留。
实现者 可以 通过对占位符采用不同的转义和转换策略,来生成最终的日志。 而使用者在不知道上下文的前提下,不应该 提前转义占位符。
以下是一个占位符使用的例子:
1<?php
2
3/**
4 * 用上下文信息替换记录信息中的占位符
5 */
6function interpolate($message, array $context = array())
7{
8 // 构建一个花括号包含的键名的替换数组
9 $replace = array();
10 foreach ($context as $key => $val) {
11 // 检查该值是否可以转换为字符串
12 if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
13 $replace['{' . $key . '}'] = $val;
14 }
15 }
16
17 // 替换记录信息中的占位符,最后返回修改后的记录信息。
18 return strtr($message, $replace);
19}
20
21// 含有带花括号占位符的记录信息。
22$message = "User {username} created";
23
24// 带有替换信息的上下文数组,键名为占位符名称,键值为替换值。
25$context = array('username' => 'bolivar');
26
27// 输出 "User bolivar created"
28echo interpolate($message, $context);error、warning、notice)。
Exception 对象,必须 以 exception 作为键名。 记录异常信息是很普遍的,所以如果它能够在记录类库的底层实现,就能够让实现者从异常信息中抽丝剥茧。 当然,实现者在使用它时,必须 确保键名为 exception 的键值是否真的是一个 Exception,毕竟它 可以 装载任何信息。
Psr\Log\AbstractLogger 类使得只需继承它和实现其中的 log 方法,就能够很轻易地实现 LoggerInterface 接口,而另外八个方法就能够把记录信息和上下文信息传给它。
Psr\Log\LoggerTrait 也只需实现其中的 log 方法。不过,需要特别注意的是,在 traits 可复用代码块还不能实现接口前,还需要 implement LoggerInterface。
Psr\Log\NullLogger 接口 可以 为使用者提供一个备用的日志 黑洞。不过,当上下文的构建非常消耗资源时,带条件检查的日志记录或许是更好的办法。
Psr\Log\LoggerAwareInterface 接口仅包括一个 setLogger(LoggerInterface $logger) 方法,框架可以使用它实现自动连接任意的日志记录实例。
Psr\Log\LoggerAwareTrait trait 可复用代码块可以在任何的类里面使用,只需通过它提供的 $this->logger,就可以轻松地实现等同的接口。
Psr\Log\LogLevel 类装载了八个记录等级常量。
接口和类的描述、相关的异常类以及用于验证你所写代码的测试套件都将作为 psr/log 包的一部分提供。
1<?php
2
3namespace Psr\Log;
4
5/**
6 * 描述一个日志记录器实例
7 *
8 * 该消息必须实现一个__toString()的字符串或者对象.
9 *
10 * 该消息可能包含以下形式的占位符: {foo}
11 * foo 将会被关键词 "foo"中的上下文数据替换.
12 *
13 * 上下文数组可以包含任意数据, 我们只能假设代码实现者
14 * 如果给出一个生成堆栈跟踪的异常实例, 那么它的键名
15 * 必须为 "exception"。
16 *
17 * 请前往 https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
18 * 查看完整的接口规范.
19 */
20interface LoggerInterface
21{
22 /**
23 * 系统无法使用。
24 *
25 * @param string $message
26 * @param array $context
27 * @return void
28 */
29 public function emergency($message, array $context = array());
30
31 /**
32 * 必须立即采取行动。
33 *
34 * 例如: 整个网站宕机了,数据库挂了,等等。 这应该
35 * 发送短信通知警告你.
36 *
37 * @param string $message
38 * @param array $context
39 * @return void
40 */
41 public function alert($message, array $context = array());
42
43 /**
44 * 临界条件。
45 *
46 * 例如: 应用组件不可用,意外的异常。
47 *
48 * @param string $message
49 * @param array $context
50 * @return void
51 */
52 public function critical($message, array $context = array());
53
54 /**
55 * 运行时错误不需要马上处理,
56 * 但通常应该被记录和监控。
57 *
58 * @param string $message
59 * @param array $context
60 * @return void
61 */
62 public function error($message, array $context = array());
63
64 /**
65 * 例外事件不是错误。
66 *
67 * 例如: 使用过时的API,API使用不当,不合理的东西不一定是错误。
68 *
69 * @param string $message
70 * @param array $context
71 * @return void
72 */
73 public function warning($message, array $context = array());
74
75 /**
76 * 正常但重要的事件.
77 *
78 * @param string $message
79 * @param array $context
80 * @return void
81 */
82 public function notice($message, array $context = array());
83
84 /**
85 * 有趣的事件.
86 *
87 * 例如: 用户登录,SQL日志。
88 *
89 * @param string $message
90 * @param array $context
91 * @return void
92 */
93 public function info($message, array $context = array());
94
95 /**
96 * 详细的调试信息。
97 *
98 * @param string $message
99 * @param array $context
100 * @return void
101 */
102 public function debug($message, array $context = array());
103
104 /**
105 * 可任意级别记录日志。
106 *
107 * @param mixed $level
108 * @param string $message
109 * @param array $context
110 * @return void
111 */
112 public function log($level, $message, array $context = array());
113}Psr\Log\LoggerAwareInterface 1<?php
2
3namespace Psr\Log;
4
5/**
6 * logger-aware 定义实例
7 */
8interface LoggerAwareInterface
9{
10 /**
11 * 设置一个日志记录实例
12 *
13 * @param LoggerInterface $logger
14 * @return void
15 */
16 public function setLogger(LoggerInterface $logger);
17}
185. Psr\Log\LogLevel
19<?php
20
21namespace Psr\Log;
22
23/**
24 * 日志等级常量定义
25 */
26class LogLevel
27{
28 const EMERGENCY = 'emergency';
29 const ALERT = 'alert';
30 const CRITICAL = 'critical';
31 const ERROR = 'error';
32 const WARNING = 'warning';
33 const NOTICE = 'notice';
34 const INFO = 'info';
35 const DEBUG = 'debug';
36}