Completed
Pull Request — master (#52)
by
unknown
01:47
created

LaravelLogViewer::getFiles()   B

Complexity

Conditions 6
Paths 6

Size

Total Lines 24
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 6
Bugs 0 Features 0
Metric Value
c 6
b 0
f 0
dl 0
loc 24
rs 8.5126
cc 6
eloc 18
nc 6
nop 1
1
<?php
2
namespace Rap2hpoutre\LaravelLogViewer;
3
4
use Illuminate\Support\Facades\File;
5
use Psr\Log\LogLevel;
6
use ReflectionClass;
7
8
/**
9
 * Class LaravelLogViewer
10
 * @package Rap2hpoutre\LaravelLogViewer
11
 */
12
class LaravelLogViewer
13
{
14
15
    /**
16
     * @var string file
17
     */
18
    private static $file;
19
20
    private static $levels_classes = [
21
        'debug' => 'info',
22
        'info' => 'info',
23
        'notice' => 'info',
24
        'warning' => 'warning',
25
        'error' => 'danger',
26
        'critical' => 'danger',
27
        'alert' => 'danger',
28
        'emergency' => 'danger',
29
    ];
30
31
    private static $levels_imgs = [
32
        'debug' => 'info',
33
        'info' => 'info',
34
        'notice' => 'info',
35
        'warning' => 'warning',
36
        'error' => 'warning',
37
        'critical' => 'warning',
38
        'alert' => 'warning',
39
        'emergency' => 'warning',
40
    ];
41
42
    const MAX_FILE_SIZE = 52428800; // Why? Uh... Sorry
43
44
    /**
45
     * @param string $file
46
     */
47
    public static function setFile($file)
48
    {
49
        // if absolute path is given
50
        if (File::exists($file)) {
51
            self::$file = $file;
52
53
        // or check if file with given filename is in storage/logs folder
54
        } else {
55
            $file = storage_path() . '/logs/' . $file;
56
57
            if (File::exists($file)) {
58
                self::$file = $file;
59
            }
60
        }
61
    }
62
63
    /**
64
     * @return string
65
     */
66
    public static function getFileName()
67
    {
68
        return basename(self::$file);
69
    }
70
71
    /**
72
     * @return array
73
     */
74
    public static function all()
75
    {
76
        $log = array();
77
78
        $log_levels = self::getLogLevels();
79
80
        $pattern = '/\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\].*/';
81
82
        if (!self::$file) {
83
            $log_file = self::getFiles();
84
            if(!count($log_file)) {
85
                return [];
86
            }
87
            self::$file = $log_file[0];
88
        }
89
90
        if (File::size(self::$file) > self::MAX_FILE_SIZE) return null;
91
92
        $file = File::get(self::$file);
93
94
        preg_match_all($pattern, $file, $headings);
95
96
        if (!is_array($headings)) return $log;
97
98
        $log_data = preg_split($pattern, $file);
99
100
        if ($log_data[0] < 1) {
101
            array_shift($log_data);
102
        }
103
104
        foreach ($headings as $h) {
105
            for ($i=0, $j = count($h); $i < $j; $i++) {
106
                foreach ($log_levels as $level_key => $level_value) {
107
                    if (strpos(strtolower($h[$i]), '.' . $level_value)) {
108
109
                        preg_match('/^\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\].*?\.' . $level_key . ': (.*?)( in .*?:[0-9]+)?$/', $h[$i], $current);
110
111
                        if (!isset($current[2])) continue;
112
113
                        $log[] = array(
114
                            'level' => $level_value,
115
                            'level_class' => self::$levels_classes[$level_value],
116
                            'level_img' => self::$levels_imgs[$level_value],
117
                            'date' => $current[1],
118
                            'text' => $current[2],
119
                            'in_file' => isset($current[3]) ? $current[3] : null,
120
                            'stack' => preg_replace("/^\n*/", '', $log_data[$i])
121
                        );
122
                    }
123
                }
124
            }
125
        }
126
127
        return array_reverse($log);
128
    }
129
130
    /**
131
     * @param bool $basename
132
     * @return array
133
     */
134
    public static function getFiles($basename = false)
135
    {
136
        $files = glob(storage_path() . '/logs/*');
137
        $dir_files = array();
138
        foreach ($files as $key=>$file) {
139
            $tmp_array = array();
140
            if (is_dir($file)) {
141
                $tmp_array = glob($file.'/*.log');
142
                unset($files[$key]);
143
            }
144
            $dir_files = array_merge($dir_files, $tmp_array);
145
        }
146
        $files = array_merge($dir_files, $files);
147
        $files = array_reverse($files);
148
        $files = array_filter($files, 'is_file');
149
        if ($basename && is_array($files)) {
150
            foreach ($files as $k => $file) {
151
                $start = strrpos($file, 'logs/') + 5;
152
                $file = substr($file, $start);
153
                $files[$k] = basename($file);
154
            }
155
        }
156
        return array_values($files);
157
    }
158
159
    /**
160
     * @return array
161
     */
162
    private static function getLogLevels()
163
    {
164
        $class = new ReflectionClass(new LogLevel);
165
        return $class->getConstants();
166
    }
167
}
168