package cnt_log; ######################################################################## # cnt_log.pl # # A. Miyamoto # Copyright (c) 1999 Questions # http://www.questions.co.jp/ ######################################################################## ;# ;# カウンタログ作成 / イメージ出力 ;# sub make_counter { my ($package_name, $thisdir, $digit, $mode_test) = @_; my ($cnt_img, $cnt_tod, $cnt_yst, $words); &get_logdate(); $THIS_DIR = $thisdir; $DIGIT = $digit; $MODE_TEST = $mode_test; $LOG_DIR = ${THIS_DIR} . 'count_log/'; $IMG_DIR = '../'.${THIS_DIR} . 'count_img/'; %LOGFILE = ( 'count_sum' => ${LOG_DIR} . "count_sum", 'count_yst' => ${LOG_DIR} . "count_yst", 'count_tod' => ${LOG_DIR} . "count_tod", 'count_tmp' => ${LOG_DIR} . "count_tmp", 'log_file' => ${LOG_DIR} . "${yyyymm}.log", 'lock_file' => ${LOG_DIR} . "#lock#", ); # 記録フィールド作成 ($splitter, $newline) = (" ;; " , "\n" ); %FIELDS = ( 'yyyymmdd' => $date2 , 'week' => $date3 , 'hhmmss' => $date4 , 'elapsed_time' => $elapsed_time, 'HTTP_USER_AGENT' => $ENV{'HTTP_USER_AGENT'} , 'HTTP_REFERER' => $ENV{'HTTP_REFERER'} , 'REMOTE_HOST' => $ENV{'REMOTE_HOST'} , 'SERVER_NAME' => $ENV{'SERVER_NAME'} , ); $RECORDS = join ($splitter , $FIELDS{'yyyymmdd'}, $FIELDS{'week'}, $FIELDS{'hhmmss'}, $FIELDS{'elapsed_time'}, $FIELDS{'HTTP_USER_AGENT'}, $FIELDS{'HTTP_REFERER'}, $FIELDS{'REMOTE_HOST'}, $FIELDS{'SERVER_NAME'}, ) . $newline ; # ログのセーブ (!opendir(DIR, $LOG_DIR)) ? ($error_code_log = 1) : ($error_code_log = 0); (!opendir(DIR, $IMG_DIR)) ? ($error_code_img = 1) : ($error_code_img = 0); $error_code_lock = &check_loglock($LOGFILE{'lock_file'}); unless ($error_code_log or $error_code_lock){ open(LOCK, ">" . $LOGFILE{'lock_file'}); open(CNT, "<" . $LOGFILE{'count_sum'}) or ($COUNT_SUM = 0); $COUNT_SUM = ; close(CNT); $COUNT_SUM++; # 累積カウントの記録 open(CNT, ">" . $LOGFILE{'count_sum'}); print CNT $COUNT_SUM; close(CNT); # アクセスログの記録 open(LOG, ">>". $LOGFILE{'log_file'}); print LOG $RECORDS; close(LOG); # 日時記録ファイルチェック unless (-f $LOGFILE{'count_tmp'}){ open(TMP, ">" . $LOGFILE{'count_tmp'}); print TMP $FIELDS{'yyyymmdd'}; close(TMP); } # 日時記録ファイルロード open(TMP, "<" . $LOGFILE{'count_tmp'}); $tmp_yyyymmdd = ; close(TMP); # 日が変わらない場合 if ($tmp_yyyymmdd eq $FIELDS{'yyyymmdd'}){ unless (-f $LOGFILE{'count_yst'}){ $COUNT_YST = 0; open(YST, ">" . $LOGFILE{'count_yst'}); print YST $COUNT_YST; close(YST); } else{ open(YST, "<" . $LOGFILE{'count_yst'}) or ($COUNT_YST = 0); $COUNT_YST = ; close(YST); } open(TOD, "<" . $LOGFILE{'count_tod'}) or ($COUNT_TOD = 0); $COUNT_TOD = ; close(TOD); $COUNT_TOD++; open(TOD, ">" . $LOGFILE{'count_tod'}); print TOD $COUNT_TOD; close(TOD); } # 日が変わった場合 else{ open(TOD, "<" . $LOGFILE{'count_tod'}) or ($COUNT_TOD = 1); $COUNT_TOD = ; close(TOD); $COUNT_YST = $COUNT_TOD; $COUNT_TOD = 1; open(TOD, ">" . $LOGFILE{'count_tod'}); print TOD $COUNT_TOD; close(TOD); open(YST, ">" . $LOGFILE{'count_yst'}); print YST $COUNT_YST; close(YST); open(TMP, ">" . $LOGFILE{'count_tmp'}); print TMP $FIELDS{'yyyymmdd'}; close(TMP); } close(LOCK); unlink($LOGFILE{'lock_file'}); # カウント画像生成 @COUNT_SPLIT = &split_number($COUNT_SUM); $COUNT_IMG = &write_img(@COUNT_SPLIT); } elsif ($error_code_log){ $COUNT_IMG = "Error : Counld not find log directory !\n"; } else { $COUNT_IMG = "Error : Now locking !\n"; } # テストモード if ($MODE_TEST){ $words .= "
\n"; $words .= "
\n"; $words .= "

Test Mode

\n"; $words .= "\n"; $words .= "
    \n"; $words .= "
  • File Name Test\n"; $words .= "\n"; foreach $key (sort keys %LOGFILE) { $words .= "\n"; } $words .= "
    ${key}$LOGFILE{$key}
    \n"; $words .= "

    \n"; $words .= "

  • Error Code (0:no error, 1:error)\n"; $words .= "\n"; $words .= "\n"; $words .= "\n"; $words .= "\n"; $words .= "
    locking${error_code_lock}
    log dir${error_code_log}
    Image dir${error_code_img}
    \n"; $words .= "

    \n"; $words .= "

  • Record fields Test 1\n"; $words .= "\n"; foreach $key (reverse sort keys %FIELDS) { ($FIELDS{$key}) ? ($FIELDS{$key}) : ($FIELDS{$key} = "Not defined"); $words .= "\n"; } $words .= "
    ${key}$FIELDS{$key}
    \n"; $words .= "

    \n"; $words .= "

  • Record fields Test 2\n"; $words .= "
    ${RECORDS}\n"; $words .= "\n"; $words .= "
\n"; $words .= "
\n"; $words .= "
\n"; } $cnt_img = $COUNT_IMG; $cnt_tod = $COUNT_TOD; $cnt_yst = $COUNT_YST; return ($cnt_img, $cnt_tod, $cnt_yst, $words); } ;# ;# ログファイルロックチェック ;# sub check_loglock { my ($lock_file) = @_; my ($error_code); $error_code = 0; while (-f $lock_file){ if (++$count > 2){ $error_code = 1; last ; } sleep(1); } return($error_code); } ;# ;# アクセス数を桁ごとに分割 ;# sub split_number { my ($n) = @_; my (@n) = split(//, $n); ($DIGIT < 1) ? ($DIGIT = 1) : ($DIGIT); while ($#n + 1 < $DIGIT){ @n = (0, @n); } return(@n); } ;# ;# イメージ出力 ;# sub write_img { my (@n) = @_; my ($key, $result); if ($error_code_img){ $result .= "Error : Could not find image directoy !\n"; } else{ foreach $key (@n){ $result .= "\"${key}\""; } } return ($result); } ;# ;# 日時取得 ;# sub get_logdate{ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat')[$wday]; $mon++; $sec = sprintf("%.2d",$sec); $min = sprintf("%.2d",$min); $hour = sprintf("%.2d",$hour); $mday = sprintf("%.2d",$mday); $mon = sprintf("%.2d",$mon); $year += 1900; $date = "${year}/${mon}/${mday} (${week}) ${hour}:${min}:${sec}"; $date2 = "${year}/${mon}/${mday}"; $date3 = "${week}"; $date4 = "${hour}:${min}:${sec}"; $yyyymm = "${year}${mon}"; $elapsed_time = time; } 1;