スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

yiiでアクセスログ

yiiでアクセスログを取るやり方です。
すべてのコントローラーはprotected/components/Controller.phpを派生していますので、この関数のinitメソッドでアクセスログを取ることにします。

アクセスログはリモートIPとユーザエージェントとパラメーターをMongoDBに保存します。
パラメーターはさらにハッシュになっているので、MongoDBに保存すると後で検索しやすいです。

パラメーターの中にはログに保存したくない値があります。
例えばパスワードです。
そこで、パスワードが入力された場合は「xxx」に置き換えます。
yiiの場合フォームに値があると、ハッシュの階層が一つ深くなるのでそれにも対応しておきます。
EXCLUDE_RALAMSでマスクする対象のパラメーターをカンマ区切りで並べることとします。

class Controller extends CController
{
const EXCLUDE_RALAMS = "password,LoginForm/password,User/password";
public function init()
{
parent::init();
$this->accessLog();
}

private function accessLog($mask="xxx")
{
// パラメーターマスク
$params = $_REQUEST; // コピー
$excludes = explode(',', Controller::EXCLUDE_RALAMS);
foreach ($excludes as $key) {
$keyAry = explode('/', $key);
$len = count($keyAry);
switch ($len) {
case 1:
if (isset($params[$keyAry[0]])) {
$params[$keyAry[0]] = $mask;
}
break;
case 2:
if (isset($params[$keyAry[0]][$keyAry[1]])) {
$params[$keyAry[0]][$keyAry[1]] = $mask;
}
break;
}
}

$access = new Mongo()->mydb->access;
$access->insert([
'ip' => $_SERVER['REMOTE_ADDR'],
'ua' => $_SERVER['HTTP_USER_AGENT'],
'p' => $params,
], [
"safe" => true
]);
}
}
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。