BasicLogger::checkLevel()   B
last analyzed

Complexity

Conditions 9
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 9

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 6
cts 6
cp 1
rs 8.0555
c 0
b 0
f 0
cc 9
nc 2
nop 1
crap 9
1
<?php
2
/**
3
 * This file is part of the PHP Generics package.
4
 *
5
 * @package Generics
6
 */
7
namespace Generics\Logger;
8
9
use Generics\Streams\MemoryStream;
10
use Psr\Log\AbstractLogger;
11
use Psr\Log\LogLevel;
12
13
/**
14
 * This abstract class provides a basic logger functionality
15
 *
16
 * @author Maik Greubel <[email protected]>
17
 */
18
abstract class BasicLogger extends AbstractLogger
19
{
20
21
    /**
22
     * The level threshold where to log
23
     *
24
     * @var string
25
     */
26
    private $level;
27
28
    /**
29
     * Set the log level threshold
30
     *
31
     * @param string $level
32
     * @return BasicLogger
33
     */
34 1
    public function setLevel(string $level): BasicLogger
35
    {
36 1
        $this->level = $level;
37 1
        return $this;
38
    }
39
40
    /**
41
     * Checks the given level
42
     *
43
     * @param string $level
44
     * @throws \Psr\Log\InvalidArgumentException
45
     */
46 15
    private static function checkLevel($level)
47
    {
48 15
        if ($level != LogLevel::ALERT && $level != LogLevel::CRITICAL && $level != LogLevel::DEBUG && //
49 15
        $level != LogLevel::EMERGENCY && $level != LogLevel::ERROR && $level != LogLevel::INFO && //
50 15
        $level != LogLevel::NOTICE && $level != LogLevel::WARNING) {
51 1
            throw new \Psr\Log\InvalidArgumentException("Invalid log level provided!");
52
        }
53 14
    }
54
55
    /**
56
     * Format the message to log and return a memory stream of it
57
     *
58
     * @param integer $level
59
     *            The arbitrary level
60
     * @param string $message
61
     *            The message to log
62
     * @param array $context
63
     *            The context of logging
64
     *
65
     * @return \Generics\Streams\MemoryStream The formatted message
66
     */
67 15
    protected function getMessage($level, $message, array $context = array()): MemoryStream
68
    {
69
        /**
70
         * This check implements the specification request.
71
         */
72 15
        self::checkLevel($level);
73
        
74 14
        $ms = new MemoryStream();
75
        
76 14
        $ms->write(strftime("%Y-%m-%d %H:%M:%S", time()));
77 14
        $ms->interpolate("\t[{level}]: ", array(
78 14
            'level' => sprintf("%6.6s", $level)
79
        ));
80 14
        $ms->interpolate($message, $context);
81 14
        $ms->write("\n");
82
        
83 14
        return $ms;
84
    }
85
86
    /**
87
     * Must be implemented by concrete logger
88
     *
89
     * @param integer $level
90
     *            The arbitrary level
91
     * @param string $message
92
     *            The message to log
93
     * @param array $context
94
     *            The context of logging
95
     */
96
    abstract protected function logImpl($level, $message, array $context = array());
97
98
    /**
99
     *
100
     * {@inheritdoc}
101
     * @see \Psr\Log\LoggerInterface::log()
102
     */
103 12
    public function log($level, $message, array $context = array())
104
    {
105 12
        if ($this->levelHasReached($level)) {
106 12
            $this->logImpl($level, $message, $context);
107
        }
108 11
    }
109
110 15
    protected function levelHasReached($level): bool
111
    {
112 15
        $result = true;
113
        
114
        $orderedLevels = array(
115 15
            LogLevel::EMERGENCY => 0,
116 15
            LogLevel::ALERT => 1,
117 15
            LogLevel::CRITICAL => 2,
118 15
            LogLevel::ERROR => 3,
119 15
            LogLevel::WARNING => 4,
120 15
            LogLevel::NOTICE => 5,
121 15
            LogLevel::INFO => 6,
122 15
            LogLevel::DEBUG => 7
123
        );
124
        
125 15
        if ($this->level) {
126 1
            $threshold = $orderedLevels[$this->level];
127 1
            $reached = $orderedLevels[$level];
128 1
            $result = $reached <= $threshold;
129
        }
130
        
131 15
        return $result;
132
    }
133
}
134