[Web-SIG] again about logging in WSGI

Manlio Perillo manlio_perillo at libero.it
Sat Nov 24 11:53:09 CET 2007


Graham Dumpleton ha scritto:
> [...]
>> Too complex, IMHO.
> 
> Actually, if you don't try and bind it back to a specific request, and
> just use the main error log file, it is actually quite easy.
> 
>> I think that it is better to have two separate logging objects.
>> wsgi.errors and sys.stderr, as an example.
> 
> Huh. These exist now. But you said you don't want to be using
> sys.stderr since WSGI PEP says nothing about it.
> 

No, sys.stderr is fine.

>> With these two objects a middleware/application can:
>> - setup the global logging object using sys.stderr
>> - setup(?) a logging object in the wsgi dictionary using wsgi.errors
>>
>> A first improvement is to add to the wsgi dictionary something like
>> nginx.log_level (this must be done in the server configuration file,
>> using, as an example, the `wsgi_param` directive)
>>
>> so that the middleware knows the log level used by the server.
>>
>> In this way, as an example, if the log level is 'NGX_ERROR' and a WSGI
>> application do something like:
>>    log.debug("a debug message")
>>
>> this message does not will be written to the server log.
> 
> I think I must be missing something about now nginx works. In Apache
> the user code doesn't make the decision as to whether it needs to log
> something or not. You log something, passing the notional log value
> that the code wants that message to be logged at. Internally, Apache
> will compare that notional log level to what it its threshold is and
> decide to allow it through or not.
> 

It is the same with Nginx.

> Thus, I don't understand why the log level threshold value which
> dictates what is filtered needs to be exposed in the Python code side
> of things.
> 

I have posted an example.

Let's suppose that the log levels in the server are:
NGX_LOG_EMERG             1
NGX_LOG_ALERT             2
NGX_LOG_CRIT              3
NGX_LOG_ERR               4
NGX_LOG_WARN              5
NGX_LOG_NOTICE            6
NGX_LOG_INFO              7
NGX_LOG_DEBUG             8



Now let's suppose that the wsgi.errors and sys.stderr internally use the 
NGX_LOG_ERR log level (but this should be modificable by the user, IMHO).


Finally, the WSGI application calls:
log.debug("ops").


The problem with this is that, in the log file, it could be added:
2007/11/24 11:46:09 [err] 29902#0: *1 DEBUG ops


This is not what I want.
A message with DEBUG log level should not be written to the log file.


The solution is to do:
{
   # nginx config file
   ...
   wsgi_param  nginx.log_level  40 # logging.ERROR
   ...
}

logging.basicConfig(level=environ['nginx.log_level'],
     format=%(levelname)s %(message)s', stream=sys.stderr)



> I guess I'll just have to wait until later to see what it is you are
> thinking of. :-)
>



Manlio Perillo


More information about the Web-SIG mailing list