Apache: ¿se puede hacer que ErrorLog registre también nombres de host en lugar de direcciones IP?

Apache: ¿se puede hacer que ErrorLog registre también nombres de host en lugar de direcciones IP?

Tener diferentes servidores Apache en un int de baja cargareal academia de bellas artesnet con casi sólo clientes DHCP, necesitamos registrar nombres de host en lugar de direcciones IP. Como el entorno DHCP es bastante dinámico, cualquier intento posterior de reasignar direcciones IP a nombres de host probablemente arrojaría resultados falsos.

Aunque tenemos " HostnameLookups On", solo el registro de acceso registra obedientemente los nombres de host, pero el Registro de errores no.

Al leer sobre ErrorLogFormat, noto que no hay%h, pero solo%a(que significa "dirección IP y puerto del cliente").

Entonces, ¿realmente no hay forma de que Apache también registre los nombres de host en el registro de errores...?

Respuesta1

No nativo con la Directiva ErrorLog.

Lo que haría es escribir un script que lo resuelva por usted y canalizar el ErrorLog a través de eso. En tu configuración de Apache algo como esto:

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

Y luego un script Perl de muestra:

#!/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;
}

información relacionada