Passed
Push — master ( 368ea8...00a7e0 )
by Kris
02:37 queued 01:05
created

ApacheErrorLogParser::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 44
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 27
c 1
b 0
f 0
dl 0
loc 44
rs 9.488
cc 1
nc 1
nop 2
1
<?php declare(strict_types=1);
2
3
/** 
4
 *  ___                      _
5
 * | _ \ __ _  _ _  ___ ___ | | ___  __ _
6
 * |  _// _` || '_|(_-</ -_)| |/ _ \/ _` |
7
 * |_|  \__,_||_|  /__/\___||_|\___/\__, |
8
 *                                  |___/
9
 * 
10
 * (c) Kristuff <[email protected]>
11
 *
12
 * For the full copyright and license information, please view the LICENSE
13
 * file that was distributed with this source code.
14
 *
15
 * @version    0.2.0
16
 * @copyright  2017-2020 Kristuff
17
 */
18
19
namespace Kristuff\Parselog\Software;
20
21
use Kristuff\Parselog\Core\LogEntryFactoryInterface;
22
23
/**
24
 * ApacheErrorLogParser 
25
 * 
26
 * Default format from software doc [%t] [%l] [pid %P] %F: %E: [client %a] %M
27
 * 
28
 * Depending on the version and error it could be
29
 * 2.2:             [Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test
30
 * 2.4:             [Thu Jun 27 11:55:44.569531 2013] [core:info] [pid 4101:tid 2992634688] [client 1.2.3.4:46652]
31
 * 2.4 (no client): [Fri Sep 25 20:23:41.378709 2020] [mpm_prefork:notice] [pid 10578] AH00169: caught SIGTERM, shutting down
32
 * 2.4 (perfork):   [Mon Dec 23 07:49:01.981912 2013] [:error] [pid 3790] [client 204.232.202.107:46301] script '/var/www/timthumb.php' not found or unable to
33
 * Reference: https://github.com/fail2ban/fail2ban/issues/268
34
 * 
35
 * @see https://httpd.apache.org/docs/2.4/fr/mod/core.html#errorlogformat
36
 * 
37
 */
38
class ApacheErrorLogParser extends SoftwareLogParser
39
{
40
    /**
41
     * Constructor
42
     * 
43
     * @access public
44
     * @param string                    $format    
45
     * @param LogEntryFactoryInterface  $factory        
46
     * 
47
     * @return void
48
     */
49
    public function __construct(string $format = null, LogEntryFactoryInterface $factory = null)
50
    {
51
        $this->software           = 'Apache';
52
        $this->prettyName         = 'Apache Error';
53
        $this->defaultFormat      = '%t %l %P %E: %a %M';
54
        $this->addFormat('default', '%t %l %P %E: %a %M');  
55
56
        $this->addPath("/var/log/");
57
        $this->addPath("/var/log/apache/");
58
        $this->addPath("/var/log/apache2/");
59
        $this->addPath("/var/log/httpd/");
60
        $this->addPath("/usr/local/var/log/apache/");
61
        $this->addPath("/usr/local/var/log/apache2/");
62
        $this->addPath("/usr/local/var/log/httpd/");
63
        $this->addPath("/opt/local/apache/logs/");
64
        $this->addPath("/opt/local/apache2/logs/");
65
        $this->addPath("/opt/local/httpd/logs/");
66
        $this->addPath("C:/wamp/logs/");
67
68
        $this->addFile('error.log');
69
        $this->addFile('error_log');
70
        $this->addFile("apache_error.log"); 
71
72
        $this->addColumn('%%' , 'percent',      '',             '(?P<percent>\%)');
73
        $this->addColumn('%t' , 'time',         'Date',         '\[(?P<time>(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{2}:\d{2}:\d{2}(\.\d{6}|) \d{4})\]');
74
        
75
        // %a 	Client IP address and port of the request 
76
        $this->addColumn('%a' , 'remoteIP',     'IP',           '\[client (?P<remoteIp>{{PATTERN_IP_ALL}})(:[\d]+|)\]', false);
77
        
78
        $this->addColumn('%A',  'localIP',      'Local IP',      '(?P<localIp>{{PATTERN_IP_ALL}})', false);
79
        
80
        // %l 	Loglevel of the message
81
        $this->addColumn('%l', 'level',         'Level',        '\[(?P<level>[\w:]+)\]');
82
83
        // %P 	Process ID of current process (since apache 2.4?)
84
        $this->addColumn('%P',  'pid',           'PID',          '\[pid (?P<pid>\d+)\]', false);
85
        
86
        // %E 	APR/OS error status code and string
87
        $this->addColumn('%E:' , 'errorCode',   'Error',        '(?P<errorCode>[\w\d\s:]+):', false);              
88
89
        // %M 	The actual log message
90
        $this->addColumn('%M', 'message', 'Message', '(?P<message>.+?)');
91
    
92
        parent::__construct($format, $factory);
93
    } 
94
}