Apache-2.2
Apache:可以讓 ErrorLog 也記錄主機名而不是 IP 地址嗎?
在幾乎只有 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; }