Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
81.82% |
9 / 11 |
CRAP | |
93.59% |
73 / 78 |
RequestDumpListener | |
0.00% |
0 / 1 |
|
81.82% |
9 / 11 |
29.22 | |
93.59% |
73 / 78 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
onKernelRequest | |
100.00% |
1 / 1 |
3 | |
100.00% |
11 / 11 |
|||
onResponse | |
100.00% |
1 / 1 |
3 | |
100.00% |
13 / 13 |
|||
getSubscribedEvents | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
addExcludeKey | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
removeExcludeKey | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 3 |
|||
logRequest | |
100.00% |
1 / 1 |
1 | |
100.00% |
19 / 19 |
|||
logResponse | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
logSession | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
logArray | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
logKeyValuePair | |
100.00% |
1 / 1 |
13 | |
100.00% |
18 / 18 |
<?php | |
namespace Eccube\EventListener; | |
use Eccube\Application; | |
use Monolog\Logger; | |
use Symfony\Component\EventDispatcher\EventSubscriberInterface; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
use Symfony\Component\HttpFoundation\Session\SessionInterface; | |
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; | |
use Symfony\Component\HttpKernel\Event\GetResponseEvent; | |
use Symfony\Component\HttpKernel\KernelEvents; | |
/** | |
* リクエストログ出力ため Listener | |
* | |
* ログ出力を除外したいキーは log.yml の exclude_keys で設定します. | |
* addExcludeKey(), removeExcludeKey() でも設定できます. | |
* | |
* @author Kentaro Ohkouchi | |
*/ | |
class RequestDumpListener implements EventSubscriberInterface | |
{ | |
private $app; | |
private $excludeKeys; | |
/** | |
* Constructor function. | |
* | |
* @param Application $app | |
*/ | |
public function __construct(Application $app) | |
{ | |
$this->app = $app; | |
$this->excludeKeys = $app['config']['log']['exclude_keys']; | |
} | |
/** | |
* Kernel request listener callback. | |
* | |
* @param GetResponseEvent $event | |
*/ | |
public function onKernelRequest(GetResponseEvent $event) | |
{ | |
if (!$event->isMasterRequest()) { | |
return; | |
} | |
$log = '** before *****************************************:'.PHP_EOL; | |
$request = $event->getRequest(); | |
$log .= $this->logRequest($request); | |
$Session = $request->getSession(); | |
if ($request->hasSession()) { | |
$log .= $this->logSession($Session); | |
} | |
$this->app->log($log, array(), Logger::DEBUG); | |
log_debug($log); | |
} | |
/** | |
* Kernel response listener callback. | |
* | |
* @param FilterResponseEvent $event | |
*/ | |
public function onResponse(FilterResponseEvent $event) | |
{ | |
if (!$event->isMasterRequest()) { | |
return; | |
} | |
$log = '** after *****************************************:'.PHP_EOL; | |
$response = $event->getResponse(); | |
$log .= $this->logResponse($response); | |
$request = $event->getRequest(); | |
$log .= $this->logRequest($request); | |
$Session = $request->getSession(); | |
if ($request->hasSession()) { | |
$log .= $this->logSession($Session); | |
} | |
$this->app->log($log, array(), Logger::DEBUG); | |
log_debug($log); | |
} | |
/** | |
* Return the events to subscribe to. | |
* | |
* @return array | |
*/ | |
public static function getSubscribedEvents() | |
{ | |
return array( | |
KernelEvents::REQUEST => 'onKernelRequest', | |
KernelEvents::RESPONSE => 'onResponse', | |
); | |
} | |
/** | |
* ログ出力を除外するキーを追加します. | |
* | |
* @param string $key 除外対象のキー | |
*/ | |
protected function addExcludeKey($key) | |
{ | |
$this->excludeKeys[] = $key; | |
} | |
/** | |
* ログ出力を除外するキーを削除します. | |
* | |
* @param string $key 削除対象のキー | |
*/ | |
protected function removeExcludeKey($key) | |
{ | |
if (array_key_exists($key, $this->excludeKeys)) { | |
unset($this->excludeKeys[$key]); | |
} | |
} | |
/** | |
* Request のログを出力する. | |
* | |
* @param Request $request | |
* @return string Request のログ | |
*/ | |
protected function logRequest(Request $request) | |
{ | |
$log = ''; | |
$log .= $this->logKeyValuePair('REMOTE_ADDR', $request->getClientIp()); | |
$log .= $this->logKeyValuePair('SCRIPT_NAME', $request->getScriptName()); | |
$log .= $this->logKeyValuePair('PATH_INFO', $request->getPathInfo()); | |
$log .= $this->logKeyValuePair('BASE_PATH', $request->getBasePath()); | |
$log .= $this->logKeyValuePair('BASE_URL', $request->getBaseUrl()); | |
$log .= $this->logKeyValuePair('SCHEME', $request->getScheme()); | |
$log .= $this->logKeyValuePair('REMOTE_USER', $request->getUser()); | |
$log .= $this->logKeyValuePair('HTTP_HOST', $request->getSchemeAndHttpHost()); | |
$log .= $this->logKeyValuePair('REQUEST_URI', $request->getRequestUri()); | |
$log .= $this->logKeyValuePair('METHOD', $request->getRealMethod()); | |
$log .= $this->logKeyValuePair('LOCALE', $request->getLocale()); | |
// $log .= $this->logArray($request->server->all(), '[server]'); // 大量にログ出力される... | |
$log .= $this->logArray($request->headers->all(), '[header]'); | |
$log .= $this->logArray($request->query->all(), '[get]'); | |
$log .= $this->logArray($request->request->all(), '[post]'); | |
$log .= $this->logArray($request->attributes->all(), '[attributes]'); | |
$log .= $this->logArray($request->cookies->all(), '[cookie]'); | |
$log .= $this->logArray($request->files->all(), '[files]'); | |
return $log; | |
} | |
/** | |
* Response のログを出力する. | |
* | |
* @param Response $response | |
* @return string Response のログ | |
*/ | |
protected function logResponse(Response $response) | |
{ | |
$log = ''; | |
$log .= $this->logKeyValuePair('HTTP_STATUS', $response->getStatusCode()); | |
return $log; | |
} | |
/** | |
* Session のログを出力する. | |
*/ | |
protected function logSession(SessionInterface $Session) | |
{ | |
return $this->logArray($Session->all(), '[session]'); | |
} | |
/** | |
* 配列をログ出力する. | |
*/ | |
protected function logArray(array $values, $prefix = '') | |
{ | |
$log = ''; | |
foreach ($values as $key => $val) { | |
$log .= $this->logKeyValuePair($key, $val, $prefix); | |
} | |
return $log; | |
} | |
/** | |
* キーと値のペアをログ出力する. | |
* | |
* 除外キーに該当する値は, マスクをかける | |
*/ | |
protected function logKeyValuePair($key, $value, $prefix = '') | |
{ | |
if (in_array($key, $this->excludeKeys)) { | |
return ''; | |
} | |
if (is_null($value) || is_scalar($value) || (is_object($value) && method_exists($value, '__toString'))) { | |
$copy_value = $value; | |
} elseif (is_object($value)) { | |
try { | |
$copy_value = '[object '.serialize($value).']'; | |
} catch (\Exception $e) { | |
return $e->getMessage().PHP_EOL; | |
} | |
} else { | |
$copy_value = $value; | |
if (is_array($copy_value)) { | |
foreach ($copy_value as $key => &$val) { | |
if (in_array($key, $this->excludeKeys) | |
&& $prefix != '[header]') { // XXX header にもマスクがかかってしまう | |
$val = '******'; | |
} | |
} | |
} | |
try { | |
$copy_value = '['.serialize($copy_value).']'; | |
} catch (\Exception $e) { | |
return $e->getMessage().PHP_EOL; | |
} | |
} | |
return ' '.$prefix.' '.$key.'='.$copy_value.PHP_EOL; | |
} | |
} |