Til brug i et større system har jeg lavet en wrapper-klasse omkring
Apache::Log. Basalt set kan den koges ned til følgende modul:
package Achme::Log::Apache
sub new {
my ($class) = @_;
my $this;
bless \$this, $class
}
sub AUTOLOAD {
my $this = shift;
return if $AUTOLOAD =~ /::DESTROY$/;
my $name = $AUTOLOAD;
$name =~ s/.*:://;
my $log;
if (exists $ENV{'MOD_PERL'}) {
if (my $r = Apache->request) {
$log = $r->log;
} elsif (my $s = Apache->server) {
$log = $s->log;
}
}
unless ($log) {
$log = new Acme::Log;
$log->info("Not running under mod_perl. Falling back to Acme::Log") unless $$this++;
}
no strict 'refs';
$log->$name(@_);
}
__END__
Det virker også ganske fint.
Problemet er bare at Apache::Log's debug-funktion skriver filnavnet og
linjenummeret ud for den linje hvorfra den er blevet kaldt. Med
ovenstående implementation er det altid linjen '$log->$name(@_);'
Jeg går ud fra at Apache::Log kikker i caller-stakken. Der skulle vel
ikke være en smart måde at skjulle dette ekstra lag for Apache::Log så
den skriver filnavn og linjenummer ud for det sted der har kaldt min
debug-funktion?
--
Peter Makholm | I laugh in the face of danger. Then I hide until
peter@makholm.net | it goes away
http://hacking.dk | -- Xander