/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Wrapper rundt om Apache::Log
Fra : Peter Makholm


Dato : 12-09-02 16:18

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

 
 
Peter Makholm (17-09-2002)
Kommentar
Fra : Peter Makholm


Dato : 17-09-02 10:50

Peter Makholm <peter@makholm.net> writes:

Hmmmm, enten har alle eksperterne puttet mig i deres kill-filter eller
også er det ikke et let spørgsmål.

> 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?

Er der så i det mindste ikke en mulighed for at skrive beskeder ud med
debug-status uden at Apache::Log tilføjer filnavnet og linjenummeret?

Så kan jeg altid selv gører det de nødvendige steder i wrapperen.

--
Peter Makholm | There are 10 kinds of people. Those who count in
peter@makholm.net | binary and those who don't
http://hacking.dk |

Peter Makholm (17-09-2002)
Kommentar
Fra : Peter Makholm


Dato : 17-09-02 11:48

Peter Makholm <peter@makholm.net> writes:

> Er der så i det mindste ikke en mulighed for at skrive beskeder ud med
> debug-status uden at Apache::Log tilføjer filnavnet og linjenummeret?

Ok, en skal bare læse sourcen for at få svar. Nej, det er ikke muligt.

Enten skal man til at patche Log.xs i mod_perl sourcen eller også skal
man fifle med hvad caller-funktionen når den bliver kaldt fra
Log.xs-filen. Det ser lidt ud som en blindgyde.

--
Peter Makholm | First you fall in love with Antarctica, and then it
peter@makholm.net | breaks you heart
http://hacking.dk | -- Antarctica

Peter Makholm (17-09-2002)
Kommentar
Fra : Peter Makholm


Dato : 17-09-02 13:09

Peter Makholm <peter@makholm.net> writes:


Ok, lidt kreativ brug af eval og #line løser problemet. Så er vi dog
også ude i et område af perl som jeg ikke mener hører ind under pæn
perl. Jeg fralægger mig et hvert ansvar for folk der læser løsninger.

Kodestykket der lavede selve kaldet til log-funktionen ændres fra
følgende:

> no strict 'refs';
> $log->$name(@_);

til:

eval qq{
#line $line "$filename"
\$log->$name(\@_);
}

Ikke særlig smukt, men det virker uden at man skal til at ændre i
selve mod_perl. Nu tror jeg også jeg er færig med at snakke med mig selv.

--
Peter Makholm | 'Cause suicide is painless
peter@makholm.net | It brings on many changes
http://hacking.dk | And I can take or leave it if I please
| -- Suicide is painless

Dennis Haney (23-09-2002)
Kommentar
Fra : Dennis Haney


Dato : 23-09-02 07:58

Peter Makholm <peter@makholm.net> writes:

> Peter Makholm <peter@makholm.net> writes:
>
>
> Ok, lidt kreativ brug af eval og #line løser problemet. Så er vi dog
> også ude i et område af perl som jeg ikke mener hører ind under pæn
> perl. Jeg fralægger mig et hvert ansvar for folk der læser løsninger.
>
> Kodestykket der lavede selve kaldet til log-funktionen ændres fra
> følgende:
>
> > no strict 'refs';
> > $log->$name(@_);
>
> til:
>
> eval qq{
> #line $line "$filename"
> \$log->$name(\@_);
> }
>
> Ikke særlig smukt, men det virker uden at man skal til at ændre i
> selve mod_perl. Nu tror jeg også jeg er færig med at snakke med mig selv.

Heh. Det var da en god løsning, som jeg ikke lige havde overvejet ;)
Altså god som i at den virker...

--
Dennis
I have always thought explanations were overkill when correcting
mistakes. A simple "that's wrong" must suffice. I mean, people are
always aware why they are wrong. They just make mistakes to annoy you.

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste