create a log level for python logging module

dj d.a.abernathy at gmail.com
Tue Mar 31 16:14:49 EDT 2009


On Mar 31, 12:58 pm, MRAB <goo... at mrabarnett.plus.com> wrote:
> 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))

If it's not asking to much, could you show me how these would be
used ?
I tried on my own, but I keep getting errors.



More information about the Python-list mailing list