diff -urN ../htmllint.orig/htmllint.cgi ./htmllint.cgi --- ../htmllint.orig/htmllint.cgi Fri May 9 01:21:00 2014 +++ ./htmllint.cgi Fri May 9 01:22:00 2014 @@ -213,7 +213,7 @@ &ErrorExit($LOGSDIR.$msgCannotMkdir); } } else { - $SCOREFILE = $SCORECOUNTER = $STATFILE = ''; + $SCOREFILE = $SCORECOUNTER = $STATFILE = $ERRORFILE = ''; } # HTMLをローカルに得る @@ -997,6 +997,7 @@ sub ErrorExit { my (@msgs) = @_; + &LogError(@msgs) if $ERRORFILE; &PrintHTMLHeader("$PROGNAME error!"); &Jprint(qq|

$PROGNAME error!

\n|); while (@msgs) { @@ -1082,6 +1083,38 @@ EndOfHTMLFooter } +# エラーの記録 +sub LogError +{ + my $errmsg = join('', @_); + $errmsg =~ s// /oig; + $errmsg =~ s/<\/?.*?>//oig; + $errmsg =~ s/&/&/oig; + $errmsg =~ s/<//oig; +#$errmsg =~ s/"/"/oig; + + my $request = $ENV{'REQUEST_METHOD'}; + my $method = $cgi->param('Method'); + $method =~ s/(\W)/'%'.unpack('H2',$1)/oge; # 念のため + $method ||= '-'; + + my $file = $ERRORFILE; + my ($sec, $min, $hour, $mday, $mon, $year) = localtime(time); + my $post = sprintf('%04d%02d', 1900+$year, 1+$mon); + $file =~ s/#/$post/g; + my $existfile = -e $file; + if (open(LOGF, ($existfile? '>>': '>').$file)) { + flock(LOGF, 2) if $UNIX; + my $rhost = ($ENV{REMOTE_HOST} or $ENV{REMOTE_ADDR}); + print LOGF sprintf('%04d/%02d/%02d %02d:%02d:%02d', 1900+$year, 1+$mon, $mday, $hour, $min, $sec), + " $rhost $request $method \"$errmsg\"\n"; +# flock(LOGF, 8) if $UNIX; + close(LOGF); + chmod 0766, $file; + } +} + # 得点の記録 sub LogScore { diff -urN ../htmllint.orig/htmllintenv ./htmllintenv --- ../htmllint.orig/htmllintenv Sun May 4 00:30:00 2014 +++ ./htmllintenv Sun May 4 01:49:41 2014 @@ -98,6 +98,10 @@ #$SCOREFILE = "${LOGSDIR}score#.log"; #$SCORECOUNTER = "${LOGSDIR}score.cnt"; +# エラー記録用ログファイル (不要ならコメントアウト) +# # の部分は年月に置き換わります +$ERRORFILE = "${LOGSDIR}error#.log"; + # 警告の統計用ログファイル (不要ならコメントアウト) # # の部分は年月に置き換わります #$STATFILE = "${LOGSDIR}statistics#.log";