Completed
Push — master ( 1fb4f2...39dd26 )
by Maik
03:07
created

BasicLogger::setLevel()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

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