Failed Conditions
Pull Request — experimental/3.1 (#2449)
by Kiyotaka
52:40
created

LogHelper   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 141
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 98.53%

Importance

Changes 0
Metric Value
dl 0
loc 141
ccs 67
cts 68
cp 0.9853
rs 10
c 0
b 0
f 0
wmc 18
lcom 1
cbo 9

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
F getHandler() 0 118 17
1
<?php
2
3
/*
4
 * This file is part of EC-CUBE
5
 *
6
 * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved.
7
 *
8
 * http://www.lockon.co.jp/
9
 *
10
 * This program is free software; you can redistribute it and/or
11
 * modify it under the terms of the GNU General Public License
12
 * as published by the Free Software Foundation; either version 2
13
 * of the License, or (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 * GNU General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU General Public License
21
 * along with this program; if not, write to the Free Software
22
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23
 */
24
25
namespace Eccube\Log\Monolog\Helper;
26
27
use Eccube\Entity\Customer;
28
use Eccube\Entity\Member;
29
use Eccube\Log\Monolog\Processor\IntrospectionProcessor;
30
use Eccube\Log\Monolog\Processor\WebProcessor;
31
use Monolog\Formatter\LineFormatter;
32
use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
33
use Monolog\Handler\FingersCrossedHandler;
34
use Monolog\Handler\RotatingFileHandler;
35
use Monolog\Logger;
36
use Monolog\Processor\UidProcessor;
37
38
/**
39
 * Handler生成クラス
40
 *
41
 * @package Eccube\Log\Monolog\Helper
42
 */
43
class LogHelper
44
{
45
46
    /** @var  \Eccube\Application */
47
    protected $app;
48
49
    /**
0 ignored issues
show
introduced by
Doc comment for parameter "$app" missing
Loading history...
50
     * EccubeMonologHelper constructor.
51
     *
52
     */
53 1100
    public function __construct($app)
54
    {
55 1100
        $this->app = $app;
56
    }
57
58
    /**
59
     * log.ymlの内容に応じたHandlerの設定を行う
60
     *
61
     * @param array $channelValues
62
     * @return FingersCrossedHandler
63
     */
64 1100
    public function getHandler(array $channelValues)
65
    {
66 1100
        $app = $this->app;
67
68 1100
        $levels = Logger::getLevels();
69
70
        // ファイル名などの設定を行い、設定がなければデフォルト値を設定
71 1100
        $logFileName = isset($channelValues['filename']) ? $channelValues['filename'] : $app['config']['log']['filename'];
72 1100
        $delimiter = isset($channelValues['delimiter']) ? $channelValues['delimiter'] : $app['config']['log']['delimiter'];
73 1100
        $dateFormat = isset($channelValues['dateformat']) ? $channelValues['dateformat'] : $app['config']['log']['dateformat'];
74 1100
        $logLevel = isset($channelValues['log_level']) ? $channelValues['log_level'] : $app['config']['log']['log_level'];
75 1100
        $actionLevel = isset($channelValues['action_level']) ? $channelValues['action_level'] : $app['config']['log']['action_level'];
76 1100
        $passthruLevel = isset($channelValues['passthru_level']) ? $channelValues['passthru_level'] : $app['config']['log']['passthru_level'];
77 1100
        $maxFiles = isset($channelValues['max_files']) ? $channelValues['max_files'] : $app['config']['log']['max_files'];
78 1100
        $logDateFormat = isset($channelValues['log_dateformat']) ? $channelValues['log_dateformat'] : $app['config']['log']['log_dateformat'];
79 1100
        $logFormat = isset($channelValues['log_format']) ? $channelValues['log_format'] : $app['config']['log']['log_format'];
80
81 1100
        if ($app['debug']) {
82 1100
            $level = Logger::DEBUG;
83
        } else {
84
            $level = $logLevel;
85
        }
86
87
88
        // RotateHandlerの設定
89 1100
        $filename = $app['config']['root_dir'].'/app/log/'.$logFileName.'.log';
90 1100
        $RotateHandler = new RotatingFileHandler($filename, $maxFiles, $level);
91 1100
        $RotateHandler->setFilenameFormat(
92 1100
            $logFileName.$delimiter.'{date}'.$app['config']['log']['suffix'],
93 1100
            $dateFormat
94
        );
95
96
        // ログフォーマットの設定(設定ファイルで定義)
97 1100
        $RotateHandler->setFormatter(new LineFormatter($logFormat.PHP_EOL, $logDateFormat, true, true));
98
99
        // FingerCossedHandlerの設定
100 1100
        $FingerCrossedHandler = new FingersCrossedHandler(
101 1100
            $RotateHandler,
0 ignored issues
show
Documentation introduced by
$RotateHandler is of type object<Monolog\Handler\RotatingFileHandler>, but the function expects a callable.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
102 1100
            new ErrorLevelActivationStrategy($levels[$actionLevel]),
103 1100
            0,
104 1100
            true,
105 1100
            true,
106 1100
            $levels[$passthruLevel]
107
        );
108
109
110
        // Processorの内容をログ出力
111 1100
        $webProcessor = new WebProcessor();
112 1100
        $uidProcessor = new UidProcessor(8);
113
114 1100
        $FingerCrossedHandler->pushProcessor(function ($record) use ($app, $uidProcessor, $webProcessor) {
115
            // ログフォーマットに出力する値を独自に設定
116
117 1100
            $record['level_name'] = sprintf("%-5s", $record['level_name']);
118
119
            // セッションIDと会員IDを設定
120 1100
            $record['session_id'] = null;
121 1100
            $record['user_id'] = null;
122 1100
            if ($app->isBooted()) {
123 1100
                if (isset($app['session'])) {
124 1100
                    $sessionId = $app['session']->getId();
125 1100
                    if ($sessionId) {
126 355
                        $record['session_id'] = substr(sha1($sessionId), 0, 8);
127
                    }
128
                }
129 1100
                if (isset($app['user'])) {
130 1100
                    $user = $app->user();
131 1100
                    if ($user instanceof Customer || $user instanceof Member) {
132 275
                        $record['user_id'] = $user->getId();
133
                    }
134
                }
135
            }
136
137 1100
            $record['uid'] = $uidProcessor->getUid();
138
139 1100
            $record['url'] = $webProcessor->getRequestUri();
140 1100
            $record['ip'] = $webProcessor->getClientIp();
141 1100
            $record['referrer'] = $webProcessor->getReferer();
142 1100
            $record['method'] = $webProcessor->getMethod();
143 1100
            $record['user_agent'] = $webProcessor->getUserAgent();
144
145
            // クラス名などを一旦保持し、不要な情報は削除
146 1100
            $line = $record['extra']['line'];
147 1100
            $functionName = $record['extra']['function'];
148
            // php5.3だとclass名が取得できないため、ファイル名を元に出力
149
            // $className = $record['extra']['class'];
150 1100
            $className = $record['extra']['file'];
151
152
            // 不要な情報を削除
153 1100
            unset($record['extra']['file']);
154 1100
            unset($record['extra']['line']);
155 1100
            unset($record['extra']['class']);
156 1100
            unset($record['extra']['function']);
157
158 1100
            $record['class'] = pathinfo($className, PATHINFO_FILENAME);
159 1100
            $record['function'] = $functionName;
160 1100
            $record['line'] = $line;
161
162 1100
            return $record;
163 1100
        });
164
165
        // クラス名等を取得するProcessor、ログ出力時にクラス名/関数名を無視するための設定を行っている
166 1100
        $skipClasses = array('Psr\\Log\\', 'Eccube\\Log\\');
167
        $skipFunctions = array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
168 1100
            'log_info',
169
            'log_notice',
170
            'log_warning',
171
            'log_error',
172
            'log_critical',
173
            'log_alert',
174
            'log_emergency'
175
        );
176 1100
        $intro = new IntrospectionProcessor(Logger::DEBUG, $skipClasses, $skipFunctions);
177 1100
        $FingerCrossedHandler->pushProcessor($intro);
178
179 1100
        return $FingerCrossedHandler;
180
181
    }
182
183
}
184