Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
CRAP | |
98.44% |
63 / 64 |
LogHelper | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
25 | |
98.44% |
63 / 64 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getHandler | |
0.00% |
0 / 1 |
17 | |
96.30% |
26 / 27 |
|||
anonymous function | |
100.00% |
1 / 1 |
7 | |
100.00% |
30 / 30 |
<?php | |
/* | |
* This file is part of EC-CUBE | |
* | |
* Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved. | |
* | |
* http://www.lockon.co.jp/ | |
* | |
* This program is free software; you can redistribute it and/or | |
* modify it under the terms of the GNU General Public License | |
* as published by the Free Software Foundation; either version 2 | |
* of the License, or (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details. | |
* | |
* You should have received a copy of the GNU General Public License | |
* along with this program; if not, write to the Free Software | |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
*/ | |
namespace Eccube\Log\Monolog\Helper; | |
use Eccube\Entity\Customer; | |
use Eccube\Entity\Member; | |
use Eccube\Log\Monolog\Processor\IntrospectionProcessor; | |
use Eccube\Log\Monolog\Processor\WebProcessor; | |
use Monolog\Formatter\LineFormatter; | |
use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; | |
use Monolog\Handler\FingersCrossedHandler; | |
use Monolog\Handler\RotatingFileHandler; | |
use Monolog\Logger; | |
use Monolog\Processor\UidProcessor; | |
/** | |
* Handler生成クラス | |
* | |
* @package Eccube\Log\Monolog\Helper | |
*/ | |
class LogHelper | |
{ | |
/** @var \Eccube\Application */ | |
protected $app; | |
/** | |
* EccubeMonologHelper constructor. | |
* | |
*/ | |
public function __construct($app) | |
{ | |
$this->app = $app; | |
} | |
/** | |
* log.ymlの内容に応じたHandlerの設定を行う | |
* | |
* @param array $channelValues | |
* @return FingersCrossedHandler | |
*/ | |
public function getHandler(array $channelValues) | |
{ | |
$app = $this->app; | |
$levels = Logger::getLevels(); | |
// ファイル名などの設定を行い、設定がなければデフォルト値を設定 | |
$logFileName = isset($channelValues['filename']) ? $channelValues['filename'] : $app['config']['log']['filename']; | |
$delimiter = isset($channelValues['delimiter']) ? $channelValues['delimiter'] : $app['config']['log']['delimiter']; | |
$dateFormat = isset($channelValues['dateformat']) ? $channelValues['dateformat'] : $app['config']['log']['dateformat']; | |
$logLevel = isset($channelValues['log_level']) ? $channelValues['log_level'] : $app['config']['log']['log_level']; | |
$actionLevel = isset($channelValues['action_level']) ? $channelValues['action_level'] : $app['config']['log']['action_level']; | |
$passthruLevel = isset($channelValues['passthru_level']) ? $channelValues['passthru_level'] : $app['config']['log']['passthru_level']; | |
$maxFiles = isset($channelValues['max_files']) ? $channelValues['max_files'] : $app['config']['log']['max_files']; | |
$logDateFormat = isset($channelValues['log_dateformat']) ? $channelValues['log_dateformat'] : $app['config']['log']['log_dateformat']; | |
$logFormat = isset($channelValues['log_format']) ? $channelValues['log_format'] : $app['config']['log']['log_format']; | |
if ($app['debug']) { | |
$level = Logger::DEBUG; | |
} else { | |
$level = $logLevel; | |
} | |
// RotateHandlerの設定 | |
$filename = $app['config']['root_dir'].'/app/log/'.$logFileName.'.log'; | |
$RotateHandler = new RotatingFileHandler($filename, $maxFiles, $level); | |
$RotateHandler->setFilenameFormat( | |
$logFileName.$delimiter.'{date}'.$app['config']['log']['suffix'], | |
$dateFormat | |
); | |
// ログフォーマットの設定(設定ファイルで定義) | |
$RotateHandler->setFormatter(new LineFormatter($logFormat.PHP_EOL, $logDateFormat, true, true)); | |
// FingerCossedHandlerの設定 | |
$FingerCrossedHandler = new FingersCrossedHandler( | |
$RotateHandler, | |
new ErrorLevelActivationStrategy($levels[$actionLevel]), | |
0, | |
true, | |
true, | |
$levels[$passthruLevel] | |
); | |
// Processorの内容をログ出力 | |
$webProcessor = new WebProcessor(); | |
$uidProcessor = new UidProcessor(8); | |
$FingerCrossedHandler->pushProcessor(function ($record) use ($app, $uidProcessor, $webProcessor) { | |
// ログフォーマットに出力する値を独自に設定 | |
$record['level_name'] = sprintf("%-5s", $record['level_name']); | |
// セッションIDと会員IDを設定 | |
$record['session_id'] = null; | |
$record['user_id'] = null; | |
if ($app->isBooted()) { | |
if (isset($app['session'])) { | |
$sessionId = $app['session']->getId(); | |
if ($sessionId) { | |
$record['session_id'] = substr(sha1($sessionId), 0, 8); | |
} | |
} | |
if (isset($app['user'])) { | |
$user = $app->user(); | |
if ($user instanceof Customer || $user instanceof Member) { | |
$record['user_id'] = $user->getId(); | |
} | |
} | |
} | |
$record['uid'] = $uidProcessor->getUid(); | |
$record['url'] = $webProcessor->getRequestUri(); | |
$record['ip'] = $webProcessor->getClientIp(); | |
$record['referrer'] = $webProcessor->getReferer(); | |
$record['method'] = $webProcessor->getMethod(); | |
$record['user_agent'] = $webProcessor->getUserAgent(); | |
// クラス名などを一旦保持し、不要な情報は削除 | |
$line = $record['extra']['line']; | |
$functionName = $record['extra']['function']; | |
// php5.3だとclass名が取得できないため、ファイル名を元に出力 | |
// $className = $record['extra']['class']; | |
$className = $record['extra']['file']; | |
// 不要な情報を削除 | |
unset($record['extra']['file']); | |
unset($record['extra']['line']); | |
unset($record['extra']['class']); | |
unset($record['extra']['function']); | |
$record['class'] = pathinfo($className, PATHINFO_FILENAME); | |
$record['function'] = $functionName; | |
$record['line'] = $line; | |
return $record; | |
}); | |
// クラス名等を取得するProcessor、ログ出力時にクラス名/関数名を無視するための設定を行っている | |
$skipClasses = array('Psr\\Log\\', 'Eccube\\Log\\'); | |
$skipFunctions = array( | |
'log_info', | |
'log_notice', | |
'log_warning', | |
'log_error', | |
'log_critical', | |
'log_alert', | |
'log_emergency' | |
); | |
$intro = new IntrospectionProcessor(Logger::DEBUG, $skipClasses, $skipFunctions); | |
$FingerCrossedHandler->pushProcessor($intro); | |
return $FingerCrossedHandler; | |
} | |
} |