Logger::log()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 2
c 1
b 0
f 0
dl 0
loc 4
rs 10
ccs 3
cts 3
cp 1
cc 1
nc 1
nop 3
crap 1
1
<?php
2
namespace RazonYang\Yii2\Psr\Log;
3
4
use yii\base\Configurable;
5
use yii\log\Logger as YiiLogger;
6
use Psr\Log\AbstractLogger;
7
use Psr\Log\LogLevel;
8
use Yii;
9
10
class Logger extends AbstractLogger implements Configurable
11
{
12
    /**
13
     * @var string $categoryParam category param name.
14
     *
15
     * @see log()
16
     */
17
    private $categoryParam;
18
19
    /**
20
     * @var array $levelMap an array that mapping from PSR log level to Yii log level.
21
     */
22
    private $levelMap;
23
24
    /**
25
     * @var int $defaultLevel default Yii logger level
26
     *
27
     * @see log()
28
     */
29
    private $defaultLevel;
30
31
    /**
32
     * @var array $defaultLevelMap default log level map.
33
     */
34
    protected $defaultLevelMap = [
35
        LogLevel::EMERGENCY => YiiLogger::LEVEL_ERROR,
36
        LogLevel::ALERT => YiiLogger::LEVEL_ERROR,
37
        LogLevel::CRITICAL => YiiLogger::LEVEL_ERROR,
38
        LogLevel::ERROR => YiiLogger::LEVEL_ERROR,
39
        LogLevel::WARNING => YiiLogger::LEVEL_WARNING,
40
        LogLevel::NOTICE => YiiLogger::LEVEL_INFO,
41
        LogLevel::INFO => YiiLogger::LEVEL_INFO,
42
        LogLevel::DEBUG => YiiLogger::LEVEL_TRACE
43
    ];
44
45 12
    public function __construct(string $categoryParam = '__CATEGORY__', ?array $levelMap = null, $defaultLevel = YiiLogger::LEVEL_INFO)
46
    {
47 12
        $this->categoryParam = $categoryParam;
48 12
        $this->levelMap = $levelMap ?? $this->defaultLevelMap;
49 12
        $this->defaultLevel = $defaultLevel;
50 12
    }
51
52
    /**
53
     * Logs with an arbitrary level.
54
     *
55
     * @param mixed  $level
56
     * @param string $message
57
     * @param array  $context
58
     */
59 8
    public function log($level, $message, array $context = [])
60
    {
61 8
        $level = $this->levelMap[$level] ?? $this->defaultLevel;
62 8
        Yii::getLogger()->log($this->interpolate($message, $context), $level, $context[$this->categoryParam] ?? 'application');
63 8
    }
64
65
    /**
66
     * Interpolates context values into the message placeholders.
67
     *
68
     * @param string $message
69
     * @param array  $context
70
     *
71
     * @return string
72
     */
73 10
    protected function interpolate(string $message, array $context = []): string
74
    {
75 10
        $replace = [];
76 10
        foreach ($context as $key => $val) {
77 3
            if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
78 3
                $replace['{' . $key . '}'] = $val;
79
            }
80
        }
81
82 10
        return strtr($message, $replace);
83
    }
84
}
85