トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

BugTrack-plugin/222

ページの作成や編集にはユーザ登録が必要です。

アクセスログ日数制限

  • 投稿者: ryon
  • カテゴリ: 修正
  • 優先度: 普通
  • 状態: 提案
  • 日時: 2005年07月17日 22時25分41秒

 内容

アクセスログの日数を制限。BugTrack-plugin/220の仕様変更版

  • 上限サイズはsetup.datで下記の様に日で指定。
    • access_log_limit_days = 7
  • ログがaccess_log_limit_daysで指定した日数を超えそうになると古い行を自動的に削除。
  • rename関数を使って排他制御実施。

オリジナルではログファイルがないときは自動で作成されますが、このプラグイン修正を施した場合は自動で作られません。あからじめアップロードしておく必要があります。

 変更点

core/ShowPageプラグインの78行目からの3行を

	my $tmp = time.".".$$;											#現在時刻&プロセス番号
	my $logname = $wiki->config('log_dir')."/".$wiki->config('access_log_file');
	my $readtmpname = $wiki->config('log_dir')."/".$tmp.".0.tmp";	# テンポラリ名は重複しない一意の名前に
	my $writetmpname = $wiki->config('log_dir')."/".$tmp.".1.tmp";	# 上に同じ
	my ($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
	my $write_record = Util::url_encode($page)." ".&log_date($sec, $min, $hour, $mday, $mon, $year)." $ip $ref $ua\n";
	my $limitdays = $wiki->config('access_log_limit_days');
	my $ref_date = date2days($year + 1900,$mon,$mday) - $limitdays;	# 基準日
	my $tmp = 1;
	until (rename $logname,$readtmpname) {							# 排他制御
		die $! if (++$tmp > 6);
		sleep ($tmp / 2);											# 混雑時は待ち時間を長くする
	}
	open(READTMP,"<".$readtmpname) or die $!;
	if ($limitdays) {
		if (my $linedata = <READTMP>) {
			if (&line_days($linedata) <= $ref_date) {				# (最古ログ日時 <= 基準日)か判定
				open(WRITETMP,">".$writetmpname) or die $!;
				while (my $linedata = <READTMP>){					# 行単位で読み込み
					if(&line_days($linedata) > $ref_date) {			# (ログ日時 > 基準日)になら書き込み
						print WRITETMP $linedata;
					}
				}
				close(READTMP);
				print WRITETMP $write_record;						# 最後に新しい行を追加
				close(WRITETMP);
				rename $writetmpname, $logname;						# 新ファイルをログファイルに改名
				unlink $readtmpname;								# 旧ファイルは捨てます
				return;
			}
		}
	}
	close(READTMP);
	open(LOG,">>".$readtmpname) or die $!;
	print LOG $write_record;
	close(LOG);
	rename $readtmpname, $logname;

に変更し、8行目に次を追加

use Time::Local;

sub log_dateを次のとおり変更

sub log_date {
	my ($sec, $min, $hour, $mday, $mon, $year) = @_;
	return sprintf("%04d/%02d/%02d %02d:%02d:%02d",
	               $year+1900,$mon+1,$mday,$hour,$min,$sec);
}

その直後に次を追加

sub line_days {
	my @splitdata = split(/\x20/, $_[0]);
	my @linedate = (split(/\//, $splitdata[1]));
	$linedate[1]--;
	return (date2days(@linedate));
}

sub date2days {
	my ($year,$mon,$mday) = @_;
	return (timelocal(0, 0, 0, $mday, $mon, $year - 1900) / 86400);
}

さくらインターネットでDate::Caclモジュールが使えなかったのでDate_to_Days関数を代替するサブルーチンを作成。

おまけ

修正ユリウス日を手計算するサブルーチンも作ってたり・・・

sub date2days {
	my ($year,$mon,$mday) = @_;
	if($mon < 3) {
		$year--;
		$mon += 12;
	}
	return(int(365.25 * ($year - 1900)) + int($year / 400) - int($year / 100) + int(30.59 * ($mon - 2)) + $mday + 15063);
}

 ライセンス

お・ま・か・せ

 対応バージョン

3.5.8で動作確認中。

 実働サンプル

排他処理の検証が一人では十分に行えないため、暫く稼働させて様子を見ます。

http://taste.sakura.ne.jp/test2/

 コメント

  • ログファイルの作り替えが一日一回になった分だけ軽い? - ryon (2005年07月17日 22時39分39秒)
  • と思います。 - あき (2005年07月17日 23時49分41秒)
  • パッチもしくは変更済みのファイルをアップしてもらってよろしいでしょうか?自分で変更してみてもなぜか失敗してしまいます。 - むーん (2005年07月30日 23時33分29秒)
  • アップしました - ryon (2005年08月08日 23時18分10秒)
  • ありがとうございました。ダウンロードさせていただきました。 - むーん (2005年08月10日 14時46分17秒)
  • attach.logについても同様の処理は出来ますでしょうか? - 名無しさん (2006年12月25日 10時08分51秒)
  • 残念ながら3.6.4では動かないようです、修正できたらよろしくお願いします - 名無しさん (2012年12月28日 23時51分51秒)
  • とりあえず fswiki3.6.4対応版を添付しておきます。ShowPage_3.6.4.pm(24) - KG (2018年02月23日 11時20分15秒)
お名前: コメント:
ShowPage.pm ShowPage_3.6.4.pm

最終更新時間:2018年02月23日 11時20分15秒