Completed
Push — master ( 039dcf...417ea8 )
by Maik
03:08
created

BasicLogger   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 15
lcom 1
cbo 3
dl 0
loc 116
ccs 37
cts 37
cp 1
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A setLevel() 0 5 1
B checkLevel() 0 8 9
A getMessage() 0 18 1
logImpl() 0 1 ?
A log() 0 6 2
A levelHasReached() 0 23 2
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