読者です 読者をやめる 読者になる 読者になる

FOR SE

文系の学部から新卒でメーカー系のSIerに就職。技術・スキルがないためブログを通して勉強。その後、IT業界の業界知識が活かせる人材業界に就職

このエントリーをはてなブックマークに追加

【php】ログの取得 ~クライアントの情報をテキストファイルに出力する~

【今回の紹介】

現場で働いていて、障害が出た時や、システムが思わぬ動きをしたときに、


「じゃあログをみてみようか」

「ログをとれる処理を埋め込んでおくね」



という流れを何度か体験したので、自分が作ったWebアプリ(しょぼい)に

ログを埋め込んでみるという作業を行いました。


※今回は、対象の処理が成功しているかというより、どんなクライアントからアクセスされているか
 を取得するログです


【処理の流れ】

ログを取得する処理の流れとしては、



①初めてのアクセスなのかを判定(クッキーの有無)


②処理時のクライアントの情報を取得(日時・リクエストメソッド・IP・ブラウザ情報・遷移元)


③ログを出力するテキストファイルを指定


④テキストファイルにログを書き込み


⑤クライアントにクッキーを与える(クッキー有効時間も設定可能)


※セッション・クッキーについては、以前にまとめたものがあるので、是非
 http://forse.hatenablog.com/entry/2014/01/18/092117



【メモ】

■わかったこと

サーバ側からログとして取得できるクライアントの情報は思ったより豊富

※巷には、ログ解析のツールとかたくさんあるからクライアントの様々な情報が取得できるのは

当たり前なんだけど、今回自分でphpのソースを見ながら、結構クライアントサイドの情報って取れるんだな    
    ーと思いました。

    たしかに今みてみるとHTTPヘッダにもクライアントの情報はかなり記載されているなーと。

たとえば、今回クラインとから取得した情報でいうと

//日付の取得

//URLの取得

//リクエストメソッドの取得

//ブラウザ情報の取得

//IPアドレス(ローカルでの::1は自分を示す)

//ホスト名を取得

//遷移元ページを取得

などなど

phpで他にどんなログがとれるのかこちらが参考

http://php.net/manual/ja/reserved.variables.server.php



【参考ソース】

<?php
if(empty($_COOKIE['test1'])){
	//日付の取得
	$time=date("Y/m/d H:i:s");
	//URLの取得
	$requestUrl=$_SERVER['REQUEST_URI'];
	//リクエストメソッドの取得
	$requestMethod=$_SERVER['REQUEST_METHOD'];
	//ブラウザ情報の取得
	$requestbrowser=$_SERVER['HTTP_USER_AGENT'];
	//IPアドレス(ローカルでの::1は自分を示す)
	$requestIp=$_SERVER['REMOTE_ADDR'];
	//ホスト名を取得
	$hostName=@gethostbyaddr($requestIp);
	//遷移元ページを取得
	$httpReferer=$_SERVER['HTTP_REFERER'];
	$log="日時は".$time.",接続先は".$requestUrl.",リクエストメソッドは".$requestMethod.",ブラウザは".$requestbrowser.",相手のIPは".$requestIp.",HOSTNAMEは".$hostName.",遷移元は".$httpReferer.",\r\n";
	
	$fp=@fopen('./log.txt','a')or die("ファイル取得できません");
		if(flock($fp,LOCK_EX)){
			fwrite($fp,$log);
		}
		flock($fp,LOCK_UN);

setcookie("test1",1,time()+1);
}

?>


※上記のログ取得処理をログを取得したい処理に

<?php
include("./log.php");
?>

しています。

.hatena-module:nth-of-type(10) { background: transparent; } .hatena-module:nth-of-type(10) .hatena-module-title{ display: none; } .hatena-module:nth-of-type(10) .hatena-module-body { padding: 0; }