Completed
Push — master ( efa801...d3c12f )
by Mihail
12s queued 11s
created

FileProcessorException::directoryDoesNotExist()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
/*
4
 * This file is part of the Koded package.
5
 *
6
 * (c) Mihail Binev <[email protected]>
7
 *
8
 * Please view the LICENSE distributed with this source code
9
 * for the full copyright and license information.
10
 *
11
 */
12
13
namespace Koded\Logging\Processors;
14
15
use Exception;
16
use Koded\Exceptions\KodedException;
17
18
/**
19
 * Log processor for storing the log messages into text files on the disk.
20
 *
21
 *  CONFIGURATION PARAMETERS
22
 *
23
 *      -   dir (string), default: sys_get_temp_dir()
24
 *          The directory for the log files. Must exist and be writable by the PHP.
25
 *
26
 *          NOTE:   the log filename is calculated from of the current
27
 *          YEAR/MONTH/DATE and appended to this directory path (ex: /path/to/logs/2000/01/01.log)
28
 *
29
 *      -   extension (string), default: .log
30
 *          The log file extension.
31
 */
32
class File extends Processor
33
{
34
    private $dir = '';
35
    private $ext = '';
36
37
    /**
38
     * {@inheritdoc}
39
     */
40 3
    public function __construct(array $settings)
41
    {
42 3
        parent::__construct($settings);
43
44 3
        umask(umask() | 0002);
45 3
        $this->ext = (string)($settings['extension'] ?? '.log');
46 3
        $this->dir = rtrim((string)$settings['dir'], '/');
47
48 3
        if (false === is_dir($this->dir)) {
49 1
            throw FileProcessorException::directoryDoesNotExist($this->dir);
50
        }
51
52 2
        if (false === is_writable($this->dir)) {
53 1
            throw FileProcessorException::directoryIsNotWritable($this->dir);
54
        }
55
56 1
        $this->dir .= '/';
57 1
    }
58
59 1
    protected function parse(array $message): void
60
    {
61
        try {
62
            // The filename should be calculated at the moment of writing
63 1
            $dir = $this->dir . date('Y/m');
64 1
            is_dir($dir) || mkdir($dir, 0775, true);
65
66 1
            file_put_contents(
67 1
                $dir . '/' . date('d') . $this->ext,
68 1
                strtr($this->format, $message) . PHP_EOL,
69 1
                FILE_APPEND
70
            );
71
72
            // @codeCoverageIgnoreStart
73
        } catch (Exception $e) {
74
            \error_log(__METHOD__, $e->getMessage(), null);
0 ignored issues
show
Bug introduced by
$e->getMessage() of type string is incompatible with the type integer expected by parameter $message_type of error_log(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

74
            \error_log(__METHOD__, /** @scrutinizer ignore-type */ $e->getMessage(), null);
Loading history...
75
            // @codeCoverageIgnoreEnd
76
        }
77 1
    }
78
}
79
80
81
class FileProcessorException extends KodedException
82
{
83
    private const
84
        E_DIRECTORY_DOES_NOT_EXIST = 1,
85
        E_DIRECTORY_NOT_WRITABLE   = 2;
86
87
    protected $messages = [
88
        self::E_DIRECTORY_DOES_NOT_EXIST => 'Log directory ":dir" must exist',
89
        self::E_DIRECTORY_NOT_WRITABLE   => 'Log directory ":dir" must be writable',
90
    ];
91
92 1
    public static function directoryDoesNotExist(string $directory): self
93
    {
94 1
        return new self(self::E_DIRECTORY_DOES_NOT_EXIST, [':dir' => $directory]);
95
    }
96
97 1
    public static function directoryIsNotWritable(string $directory): self
98
    {
99 1
        return new self(self::E_DIRECTORY_NOT_WRITABLE, [':dir' => $directory]);
100
    }
101
}
102