Jim Gallacher <[EMAIL PROTECTED]> writes:

>>>Furthermore, you can't depend on the request object being valid once 
>>>the request processing has completed. At some point request_tp_clear (in 
>>>requestobject.c) will get called and request->server will be set to 
>>>NULL. (At least I think this is correct). My gut tells me you'll get 
>>>some random seg faults.
>
> My gut was right. Your current version segfaults (using mpm-prefork). It 
> might work if you register a cleanup to remove the reference to your 
> logging handler (untested):
>
> req.register_cleanup(log.removeHandler, hdlr)
>
> The problem here is that we are depending on the user to add that line 
> to their code to avoid the segfault. I don't like the idea of including 
> code in mod_python which may result in a segfault, even if the user is 
> warned of the dangers in the docs.

Ok. I found the problem too... I was going to add an end of request
clean up to make logging rather like resource usage:

  def handler(http):
      hdlr = apache_log_handler.ApacheLogHandler(http)
      logging.getLogger().addHandler(hdlr)
      logger = logging.getLogger("webapp")
      .
      .
      .
      hdlr.end()
      return apache.OK

But I guess I ought to try and find some way of checking the validity
of the request object.


> Loggers have module level scope. When you add a handler you are adding 
> it to logging.root. In a given process, each call to 
> log.addHandler(hdlr) adds another ApacheLogHandler instance with it's 
> associated request object. Thus you would expect that when you try to 
> log an error you would see multiple messages in the apache log, but 
> mod_python actually segfaults instead, since most request objects 
> (except the current one) are likely invalid. Thus the need to remove the 
> handler at the end of the request as mentioned above.
>
>> 2. the logging record doesn't get flushed before the request has
>>    completed so that when it is flushed the correct state is no longer
>>    available.
>> 
>>    This is also possible, clearly it would be a bug because the
>>    logging record should be flushed immediately (if that's the
>>    implementation of the handler)
>
> The problem is not with the current request. That will be ok as long as 
> you are logging your message prior to the end of the request processing 
> phase. The problem is with the references to old requests being held by 
> logging.root.

You can always treat it as a resource, like a database connection that
has to be obtained and specifically thrown away.


> Just to be clear Nic, I'm not fighting you on the *idea* of including 
> your ApacheLogHandler - I may even be in favour of it. I'm just pointing 
> out some potential problems. I have a few more up my sleeve but I want 
> to test them before commenting.

Got it. I was just getting grumpy.

I'll see what I can do about making these problems go away.


Nic

Reply via email to