PSR-3:记录器接口

Logger Interface

本文档描述了用于记录库的通用接口。

主要目标是允许库以Psr\Log\LoggerInterface 简单和通用的方式接收对象并将日志写入其中。具有自定义需求的框架和CMS可以扩展接口以用于它们自己的目的,但是应该保持与该文档的兼容性。这可确保应用程序使用的第三方库可以写入集中式应用程序日志。

本文件中的关键词“必须”,“不得”,“必须”,“应该”,“不应该”,“应该”,“不应该”,“推荐”,“可以”和“可选”按照RFC 2119中的描述进行解释

implementor本文档中的单词将被解释为LoggerInterface在日志相关的库或框架中实现的人。记录器的用户称为user

1.规格

1.1基础知识

  • LoggerInterface自曝八种方法来写日志八个 RFC 5424倍的水平(调试,信息,通知,警告,错误,严重警告,紧急)。

  • 第九种方法,log接受日志级别作为第一个参数。使用其中一个日志级别常量调用此方法必须与调用特定级别的方法具有相同的结果。Psr\Log\InvalidArgumentException 如果实现不知道该级别,则必须使用此规范未定义的级别调用此方法用户不应该在不确定当前实现是否支持的情况下使用自定义级别。

1.2消息

  • 每个方法都接受一个字符串作为消息,或接受一个带有__toString()方法的对象 实现者可以对传递的对象进行特殊处理。如果不是这种情况,实现者必须将其转换为字符串。

  • 消息可以包含占位符,实现者可以替换上下文数组中的值。

    占位符名称必须对应于上下文数组中的键。

    占位符名称必须用单个左大括号{和单个右大括号分隔}分隔符和占位符名称之间不能有任何空格。

    占位符名称应该只字符组成A-Za-z0-9,下划线_和句点.其他字符的使用保留用于将来修改占位符规范。

    实现者可以使用占位符来实现各种转义策略并转换日志以供显示。用户不应预先转义占位符值,因为他们无法知道数据将在哪个上下文中显示。

    以下是占位符插值的示例实现,仅供参考:

    <?php
    
    /**
     * Interpolates context values into the message placeholders.
     */
    function interpolate($message, array $context = array())
    {
        // build a replacement array with braces around the context keys
        $replace = array();
        foreach ($context as $key => $val) {
            // check that the value can be casted to string
            if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
                $replace['{' . $key . '}'] = $val;
            }
        }
    
        // interpolate replacement values into the message and return
        return strtr($message, $replace);
    }
    
    // a message with brace-delimited placeholder names
    $message = "User {username} created";
    
    // a context array of placeholder names => replacement values
    $context = array('username' => 'bolivar');
    
    // echoes "User bolivar created"
    echo interpolate($message, $context);
    

1.3背景

  • 每个方法都接受一个数组作为上下文数据 这意味着保存任何不适合字符串的无关信息。该数组可以包含任何内容。实现者必须确保他们尽可能地对待上下文数据。上下文中的给定值不得抛出异常,也不得引发任何php错误,警告或通知。

  • 如果Exception在上下文数据中传递了一个对象,它必须在 'exception'键中。记录异常是一种常见的模式,这允许实现者在日志后端支持时从异常中提取堆栈跟踪。在使用它之前,实现者仍然必须验证'exception' 密钥实际上是否正确Exception,因为它可能包含任何内容。

1.4助手类和接口

  • Psr\Log\AbstractLogger类,可以实现LoggerInterface 通过扩展,并实现通用很容易log的方法。其他八种方法是将消息和上下文转发给它。

  • 同样,使用Psr\Log\LoggerTrait只需要您实现泛型log方法。请注意,由于traits无法实现接口,因此在这种情况下仍需要实现LoggerInterface

  • Psr\Log\NullLogger与接口一起提供。如果没有为它们提供记录器,接口的用户可以使用它来提供后备“黑洞”实现。但是,如果上下文数据创建很昂贵,则条件记录可能是更好的方法。

  • Psr\Log\LoggerAwareInterface仅包含一个 setLogger(LoggerInterface $logger)方法,并且可以通过框架被用于自动丝任意实例用记录器。

  • Psr\Log\LoggerAwareTrait特征可用于在任何类中轻松实现等效接口。它让您访问$this->logger

  • Psr\Log\LogLevel此类包含八个日志级别常量。

2.包装

描述的接口和类以及相关的异常类和用于验证实现的测试套件是作为psr / log包的一部分提供的

3. Psr \ Log \ LoggerInterface

<?php

namespace Psr\Log;

/**
 * Describes a logger instance.
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data, the only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
interface LoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function emergency($message, array $context = array());

    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function alert($message, array $context = array());

    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function critical($message, array $context = array());

    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function error($message, array $context = array());

    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function warning($message, array $context = array());

    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function notice($message, array $context = array());

    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function info($message, array $context = array());

    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function debug($message, array $context = array());

    /**
     * Logs with an arbitrary level.
     *
     * @param mixed $level
     * @param string $message
     * @param array $context
     * @return void
     */
    public function log($level, $message, array $context = array());
}

4. Psr \ Log \ LoggerAwareInterface

<?php

namespace Psr\Log;

/**
 * Describes a logger-aware instance.
 */
interface LoggerAwareInterface
{
    /**
     * Sets a logger instance on the object.
     *
     * @param LoggerInterface $logger
     * @return void
     */
    public function setLogger(LoggerInterface $logger);
}

5. Psr \ Log \ LogLevel

<?php

namespace Psr\Log;

/**
 * Describes log levels.
 */
class LogLevel
{
    const EMERGENCY = 'emergency';
    const ALERT     = 'alert';
    const CRITICAL  = 'critical';
    const ERROR     = 'error';
    const WARNING   = 'warning';
    const NOTICE    = 'notice';
    const INFO      = 'info';
    const DEBUG     = 'debug';
}