/
FilesystemLogger.php
100 lines (83 loc) · 2.19 KB
/
FilesystemLogger.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
/**
* @author Tim Gunter <tim@vanillaforums.com>
* @copyright 2016 Tim Gunter
* @license MIT
*/
namespace Kaecyra\AppCommon\Log;
/**
* A logger that writes to the filesystem.
*
* @package app-common
* @since 1.0
*/
class FilesystemLogger extends BaseLogger {
/**
* File path
* @var string
*/
private $file;
/**
* File pointer
* @var Resource
*/
private $fr;
/**
* Config
* @var array
*/
private $extra = [];
public function __construct($workingDir, array $options = []) {
$this->extra = $options;
$this->extra['dir'] = $workingDir;
$this->file = rtrim($workingDir, '/').'/'.ltrim($this->extra['file'], '/');
$this->openLog();
}
public function __destruct() {
$this->closeLog();
}
/**
* Open log file for writing
*
* Also closes currently open log file if needed.
*
* @return void
*/
public function openLog() {
if ($this->file) {
$logDir = dirname($this->file);
if (!is_dir($logDir) || !file_exists($logDir)) {
@mkdir($logDir, 0755, true);
}
if (!file_exists($this->file)) {
$touched = touch($this->file);
if (!$touched) {
throw new \Exception("Unable to open log file '{$this->file}', could not create");
}
}
if (!is_writable($this->file)) {
throw new \Exception("Unable to open log file '{$this->file}', not writable");
}
$this->fr = fopen($this->file, 'a');
}
}
/**
* Close file pointer
*/
protected function closeLog() {
fclose($this->fr);
}
/**
* Extract known columns and save the rest as attributes.
*
* @param mixed $level
* @param string $message
* @param array $context
* @return null|void
*/
public function log($level, $message, array $context = []) {
$realMessage = rtrim(static::interpolate($message, $context), "\n");
$realMessage = sprintf("[%10s] %s\n", $level, $realMessage);
fwrite($this->fr, $realMessage);
}
}