Completed
Push — master ( fcdb68...d209bc )
by Vladimir
02:46
created

StakxLogger::getOutputInterface()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
/*
4
 * This file is part of the Symfony package.
5
 *
6
 * (c) Fabien Potencier <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace allejo\stakx\Core;
13
14
use Psr\Log\AbstractLogger;
15
use Psr\Log\InvalidArgumentException;
16
use Psr\Log\LogLevel;
17
use Symfony\Component\Console\Output\OutputInterface;
18
19
/**
20
 * PSR-3 compliant console logger.
21
 *
22
 * This class is based entirely on Symfony's ConsoleLogger interface with minor modifications.
23
 *
24
 * @author Kévin Dunglas <[email protected]>
25
 *
26
 * @link http://www.php-fig.org/psr/psr-3/
27
 * @link https://github.com/symfony/console/blob/master/Logger/ConsoleLogger.php
28
 */
29
class StakxLogger extends AbstractLogger
30
{
31
    const INFO = 'info';
32
    const ERROR = 'error';
33
34
    /**
35
     * @var OutputInterface
36
     */
37
    private $output;
38
39
    /**
40
     * @var array
41
     */
42
    private $verbosityLevelMap = array(
43
        LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL,
44
        LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL,
45
        LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL,
46
        LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL,
47
        LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL,
48
        LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE,
49
        LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE,
50
        LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG,
51
    );
52
53
    /**
54
     * @var array
55
     */
56
    private $formatLevelMap = array(
57
        LogLevel::EMERGENCY => self::ERROR,
58
        LogLevel::ALERT => self::ERROR,
59
        LogLevel::CRITICAL => self::ERROR,
60
        LogLevel::ERROR => self::ERROR,
61
        LogLevel::WARNING => self::INFO,
62
        LogLevel::NOTICE => self::INFO,
63
        LogLevel::INFO => self::INFO,
64
        LogLevel::DEBUG => self::INFO,
65
    );
66
67
    /**
68
     * ConsoleInterface constructor.
69
     *
70
     * @param OutputInterface $output
71
     */
72
    public function __construct (OutputInterface $output)
73
    {
74
        $this->output = $output;
75
    }
76
77
    /**
78
     * Return the OutputInterface object
79
     *
80
     * @return OutputInterface
81
     */
82
    public function getOutputInterface ()
83
    {
84
        return $this->output;
85
    }
86
87
    /**
88
     * Logs with an arbitrary level.
89
     *
90
     * @param mixed  $level
91
     * @param string $message
92
     * @param array  $context
93
     */
94
    public function log ($level, $message, array $context = array())
95
    {
96
        if (!isset($this->verbosityLevelMap[$level])) {
97
            throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level));
98
        }
99
100
        $verbosity = $this->output->getVerbosity();
101
102
        if ($verbosity >= $this->verbosityLevelMap[$level])
103
        {
104
            $prefix = '';
105
106
            if ($verbosity >= OutputInterface::VERBOSITY_VERBOSE)
107
            {
108
                $prefix = sprintf('[%s] ', date('H:i:s'));
109
            }
110
111
            $this->output->writeln(
112
                sprintf('<%1$s>%2$s[%3$s] %4$s</%1$s>',
113
                    $this->formatLevelMap[$level],
114
                    $prefix,
115
                    $level,
116
                    $this->interpolate($message, $context)
117
                )
118
            );
119
        }
120
    }
121
122
    /**
123
     * Writes a message to the output and adds a newline at the end.
124
     *
125
     * @param string|array $messages The message as an array of lines of a single string
126
     * @param int          $options  A bitmask of options (one of the OUTPUT or VERBOSITY constants), 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL
127
     */
128
    public function writeln ($messages, $options = 0)
129
    {
130
        $this->output->writeln($messages, $options);
131
    }
132
133
    /**
134
     * Interpolates context values into the message placeholders.
135
     *
136
     * @author PHP Framework Interoperability Group
137
     *
138
     * @param string $message
139
     * @param array  $context
140
     *
141
     * @return string
142
     */
143
    private function interpolate($message, array $context)
144
    {
145
        // build a replacement array with braces around the context keys
146
        $replace = array();
147
        foreach ($context as $key => $val) {
148
            if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
149
                $replace[sprintf('{%s}', $key)] = $val;
150
            }
151
        }
152
153
        // interpolate replacement values into the message and return
154
        return strtr($message, $replace);
155
    }
156
}