Completed
Push — master ( b589b0...200ed5 )
by Ryuichi
07:09
created

LoggerConfigurationManager::load()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 8
cts 8
cp 1
rs 9.6666
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 0
crap 1
1
<?php
2
namespace WebStream\Log;
3
4
use WebStream\IO\File;
5
use WebStream\IO\Writer\SimpleFileWriter;
6
use WebStream\Container\Container;
7
use WebStream\Exception\Extend\LoggerException;
8
9
/**
10
 * LoggerConfigurationManager
11
 * @author Ryuichi Tanaka
12
 * @since 2016/01/29
13
 * @version 0.7
14
 */
15
class LoggerConfigurationManager
16
{
17
    /**
18
     * @var Container ログ設定コンテナ
19
     */
20
    private $logContainer;
21
22
    /**
23
     * @var Container IOコンテナ
24
     */
25
    private $ioContainer;
26
27
    /**
28
     * @var array<string> ログ設定情報
29
     */
30
    private $configMap;
31
32
    /**
33
     * Constructor
34
     * @param mixed $config ログ設定
35
     * @throws LoggerException
36
     */
37 141
    public function __construct($config)
38
    {
39 141
        if (is_array($config)) {
40
            $configMap = $config;
41
        } else {
42 141
            $configMap = parse_ini_file($config);
43 141
            if ($configMap === null) {
44
                throw new LoggerException("Log config file does not exist: " . $config);
45
            }
46
        }
47
48 141
        $this->logContainer = new Container(false);
49 141
        $this->ioContainer = new Container();
50
51
        $this->ioContainer->file = function () use ($configMap) {
52 141
            if (!array_key_exists("path", $configMap)) {
53
                throw new LoggerException("Log path must be defined.");
54
            }
55 141
            return new File($configMap["path"]);
56
        };
57
        $this->ioContainer->fileWriter = function () use ($configMap) {
58 8
            return new SimpleFileWriter($configMap["path"]);
59
        };
60
61 141
        $this->configMap = $configMap;
62 141
    }
63
64
    /**
65
     * 設定を読み込む
66
     * @throws LoggerException
67
     */
68 141
    public function load()
69
    {
70 141
        $this->loadLogLevel()
71 141
             ->loadLogFilePath()
72 141
             ->loadRotateCycle()
73 141
             ->loadRotateSize()
74 141
             ->loadApplicationName()
75 141
             ->loadFormat();
76 141
    }
77
78
    /**
79
     * ログ設定を返却する
80
     * @return Container ログ設定
81
     */
82 141
    public function getConfig()
83
    {
84 141
        return $this->logContainer;
85
    }
86
87
    /**
88
     * ログレベルを読み込む
89
     * @throws LoggerException
90
     */
91 141
    private function loadLogLevel()
92
    {
93 141
        if (!array_key_exists("level", $this->configMap)) {
94
            throw new LoggerException("Log level must be defined.");
95
        }
96
97 141
        $logLevel = $this->toLogLevelValue($this->configMap["level"]);
98 141
        $this->logContainer->logLevel = $logLevel;
99
100 141
        return $this;
101
    }
102
103
    /**
104
     * ログ保存先パスを読み込む
105
     * @throws LoggerException
106
     */
107 141
    private function loadLogFilePath()
108
    {
109 141
        $file = $this->ioContainer->file;
110 141
        if (!($file->exists() && $file->isFile())) {
111 8
            $this->ioContainer->fileWriter->write("");
112
        }
113
114 141
        $this->logContainer->logPath = $file->getFilePath();
115 141
        $this->logContainer->statusPath = preg_replace_callback('/(.*)\..+/', function ($matches) {
116 141
            return "$matches[1].status";
117 141
        }, $this->logContainer->logPath);
118
119 141
        return $this;
120
    }
121
122
    /**
123
     * ログローテートサイクルを読み込む
124
     * @throws LoggerException
125
     */
126 141
    private function loadRotateCycle()
127
    {
128 141
        if (array_key_exists("rotate_cycle", $this->configMap)) {
129 14
            $this->logContainer->rotateCycle = $this->cycle2value($this->configMap["rotate_cycle"]);
130
        }
131
132 141
        return $this;
133
    }
134
135
    /**
136
     * ログローテートサイズを読み込む
137
     * @throws LoggerException
138
     */
139 141
    private function loadRotateSize()
140
    {
141 141
        if (array_key_exists("rotate_size", $this->configMap)) {
142
            $rotateSize = intval($this->configMap["rotate_size"]);
143
            // ローテートサイズが不正の場合(正の整数以外の値が設定された場合)
144
            if ($rotateSize <= 0) {
145
                throw new LoggerException("Invalid log rotate size: " . $this->configMap["rotate_size"]);
146
            }
147
            $this->logContainer->rotateSize = $rotateSize;
148
        }
149
150 141
        return $this;
151
    }
152
153
    /**
154
     * アプリケーション名を読み込む
155
     */
156 141
    private function loadApplicationName()
157
    {
158 141
        if (array_key_exists("application_name", $this->configMap) && !empty($this->configMap["application_name"])) {
159 115
            $this->logContainer->applicationName = $this->configMap["application_name"];
160
        }
161
162 141
        return $this;
163
    }
164
165
    /**
166
     * ロガーフォーマットを読み込む
167
     */
168 141
    private function loadFormat()
169
    {
170 141
        if (array_key_exists("format", $this->configMap)) {
171 141
            $this->logContainer->format = $this->configMap["format"];
172
        } else {
173
            $this->logContainer->format = $this->defaultLoggerFormatter();
0 ignored issues
show
Bug introduced by
The method defaultLoggerFormatter() does not seem to exist on object<WebStream\Log\LoggerConfigurationManager>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
174
        }
175
176 141
        return $this;
177
    }
178
179
    /**
180
     * ログローテートサイクルを時間に変換
181
     * @param string ローテートサイクル
182
     * @return int ローテート時間
183
     * @throws LoggerException
184
     */
185 14
    private function cycle2value($cycle)
186
    {
187 14
        $day_to_h = 24;
188 14
        $week_to_h = $day_to_h * 7;
189 14
        $month_to_h = $day_to_h * intval(date("t", time()));
190 14
        $year_to_h = $day_to_h * 365;
191
192 14
        $year = date("Y");
193 14
        if (($year % 4 === 0 && $year % 100 !== 0) || $year % 400 === 0) {
194 14
            $year_to_h = $day_to_h * 366;
195
        }
196
197 14
        switch (strtolower($cycle)) {
198 14
            case 'day':
199 4
                return $day_to_h;
200 10
            case 'week':
201 4
                return $week_to_h;
202 6
            case 'month':
203 3
                return $month_to_h;
204 3
            case 'year':
205 3
                return $year_to_h;
206
            default:
207
                throw new LoggerException("Invalid log rotate cycle: " . $cycle);
208
        }
209
    }
210
211
    /**
212
     * ログレベルを数値に変換
213
     * ログレベルはWebStream独自、PSR-3両方対応
214
     * @param string ログレベル文字列
215
     * @throws LoggerException
216
     * @return int ログレベル数値
217
     */
218 141
    private function toLogLevelValue(string $level)
219
    {
220 141
        switch (strtolower($level)) {
221 141
            case 'debug':
222 42
                return 1;
223 99
            case 'info':
224 11
                return 2;
225 88
            case 'notice':    // PSR-3
226 11
                return 3;
227 77
            case 'warn':
228 55
            case 'warning':   // PSR-3
229 22
                return 4;
230 55
            case 'error':
231 11
                return 5;
232 44
            case 'critical':  // PSR-3
233 11
                return 6;
234 33
            case 'alert':     // PSR-3
235 11
                return 7;
236 22
            case 'emergency': // PSR-3
237 11
                return 8;
238 11
            case 'fatal':
239 11
                return 9;
240
            default:
241
                throw new LoggerException("Undefined log level: $level");
242
        }
243
    }
244
}
245