Apache-2.2

Apache:可以讓 ErrorLog 也記錄主機名而不是 IP 地址嗎?

  • December 5, 2013

在幾乎只有 DHCP 客戶端的低負載內部網路中有不同的 Apache 伺服器*,*我們需要記錄主機名而不是 IP 地址。由於 DHCP 環境是非常動態的,以後任何將 IP 重新映射到主機名的嘗試很可能會產生錯誤的結果。

雖然我們有“ HostnameLookups On”,但只有訪問日誌乖乖地記錄主機名,而錯誤日誌沒有。

閱讀關於ErrorLogFormat,我注意到沒有**%h**,而只有**%a**(意思是“客戶端IP地址和埠”)。

那麼真的沒有辦法讓apache也在錯誤日誌中記錄主機名……?

不是原生的 ErrorLog 指令。

我要做的是編寫一個腳本來為您解決問題並通過它傳遞 ErrorLog。在你的 apache 配置中是這樣的:

Errorlog "|/usr/local/bin/errorlog_resolver.pl"

然後是一個範例 Perl 腳本:

#!/usr/bin/perl -w
# errorlog_resolver.pl

# Give apache ErrorLog on STDIN, outputs them with numeric IP addresses
# in the likely (host) field converted to hostnames (where possible).

# based on clf_lookup.plx from "Perl for Web Site Management"
# http://oreilly.com/catalog/perlwsmng/chapter/ch08.html
#

use strict;
use Socket;

open LOGFILE, ">>/tmp/my_error_log" or die "Couldn't open file: $!";
my %hostname;

while (<>) {
   my $line = $_;
   my($day, $month, $dayn, $hour, $year, $err, $client, $host, $rest) = split / /, $line, 9;
   if ( $client ~~ "[client" ) {
   # remove the ] trailing the likely ip-address.
     my $chr = chop($host);

     if ($host =~ /^\d+\.\d+\.\d+\.\d+$/) {
       # looks vaguely like an IP address
       unless (exists $hostname{$host}) {
           # no key, so haven't processed this IP before
           $hostname{$host} = gethostbyaddr(inet_aton($host), AF_INET);
       }
       if ($hostname{$host}) {
           # only processes IPs with successful lookups
           $line = "$day $month $dayn $hour $year $err $client $hostname{$host}\($host\)\] $rest)";
       }
     }
   }
   print LOGFILE $line;
}

引用自:https://serverfault.com/questions/559459