Apache: o ErrorLog pode ser feito para registrar também nomes de host em vez de endereços IP?

Apache: o ErrorLog pode ser feito para registrar também nomes de host em vez de endereços IP?

Ter diferentes servidores Apache em um int de baixa cargaranet com quase apenas clientes DHCP, precisamos registrar nomes de host em vez de endereços IP. Como o ambiente DHCP é bastante dinâmico, qualquer tentativa posterior de remapear IPs para nomes de host provavelmente produziria resultados falsos.

Embora tenhamos " HostnameLookups On", apenas o log de acesso está registrando nomes de host obedientemente, mas o ErrorLog não.

Lendo sobre ErrorLogFormat, noto que não há%h, mas apenas%a(que significa "endereço IP e porta do cliente").

Então, não há realmente nenhuma maneira de o Apache também registrar nomes de host no log de erros ...?

Responder1

Não é nativo da Diretiva ErrorLog.

O que eu faria é escrever um script que resolva para você e canalizar o ErrorLog através dele. Na configuração do seu apache algo assim:

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

E então um exemplo de script 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;
}

informação relacionada