create a log level for python logging module

MRAB google at mrabarnett.plus.com
Tue Mar 31 19:58:10 CEST 2009


dj wrote:
> On Mar 30, 4:18 pm, Vinay Sajip <vinay_sa... at yahoo.co.uk> wrote:
>> On Mar 30, 4:13 pm, dj <d.a.aberna... at gmail.com> wrote:
>>
>>
>>
>>> I am trying to create a log level called userinfo for the pythonlogging. I read the source code and tried to register the level to theloggingnamespace with the following source:
>>>              fromloggingimport Logger
>>>                          # create the custom log level
>>>                                   class userinfo(Logger):
>>>                                                def userinfo(self, msg,
>>> *args, **kwargs):
>>>                                                           if
>>> self.isEnabledFor(WARNING):
>>> self._log(WARNING, msg, args, **kwargs)
>>>                               # Register log level in thelogging.Logger namespace
>>>                               Logger.userinfo = userinfo
>>> Has I am sure you guessed, it did not work. If you know how this is
>>> done or know what I am doing work or can provide a link to example
>>> code (because I have not been able to locate any), I would greatly
>>> appreciate it.
>>> My sincere and heartfelt thanks in advance.
>> See the example script at
>>
>> http://dpaste.com/hold/21323/
>>
>> which contains, amongst other things, an illustration of how to use
>> custom logging levels in an application.
>>
>> Regards,
>>
>> Vinay Sajip
> 
> I got the code setup, however, I still get an error for my custom log
> level.
> 
> ############################### Python code
> #######################################################
> 
> 
> import sys, logging
> 
> # log levels
> CRITICAL = 50
> ERROR = 40
> WARNING = 30
> USERINFO =25 # my custom log level
> INFO = 20
> DEBUG  = 10
> 
> # define the range
> LEVEL_RANGE = range(DEBUG, CRITICAL +1)
> 
> # level names
> 
> log_levels = {
> 
>     CRITICAL : 'critical',
>     ERROR : 'error',
>     WARNING : 'warning',
>     USERINFO : 'userinfo',
>     INFO : 'info',
>     DEBUG : 'debug',
> 
>     }
> 
> # associate names with our levels.
> for lvl in log_levels.keys():
>     logging.addLevelName(lvl, log_levels[lvl])
> 
> 
> 
> # setup a log instance
> logger = logging.getLogger('myLog')
> logger.setLevel(CRITICAL)
> hdlr = logging.StreamHandler()
> hdlr.setLevel(CRITICAL)
> logger.addHandler(hdlr)
> 
> # give it a try
> print 'write logs'
> logger.critical('this a critical log message')
> logger.userinfo('this is a userinfo log message')   #call custom log
> level
> 
> ######################################### Output from my interpreter
> ##################################################
> 
> Python 2.6 (r26:66721, Oct  2 2008, 11:35:03) [MSC v.1500 32 bit
> (Intel)]
> Type "help", "copyright", "credits" or "license" for more information.
> Evaluating log_level_test.py
> write logs
> this a critical log message
> AttributeError: Logger instance has no attribute 'userinfo'
> 
> I would love to know what I am doing wrong. Thanks again for your
> help, it is really appreciated.
> 
I think that custom levels don't get their own method; you have to use:

     logger.log(USERINFO, 'this is a userinfo log message')

although you could add it yourself with, say:

     setattr(logger, 'userinfo', lambda *args: logger.log(USERINFO, *args))



More information about the Python-list mailing list