Package: logpp
Whylogpp?logpp is a fairly simple module that contains some extensions for
Python’s built in logging module. It provides a few facilities that
allow you to pass extended information with logging messages.The three principle components are listed below.logpp.logging.msg()logpp.logging.LogppMessagelogpp.logging.LogppHandlerThe module also provides theLogppMixinwhich you can use to provide standardized access to a logger via theLogppMixin.loggermethod.Logging a MessageThe example below has been expanded to make the components easier to
see, but it’s actually a fairly simple one-liner. Themsg()function takes a summary str and a detail object (which in the example
is just a dictionary).The function returns aLogppMessagewhich, when represented in str form is simply the summary.logging.info(msg('The weather is currently sunny with a temperature of 25°C.',{'conditions':'sunny','temperature':25}))Logging handlers that aren’t aware of the detail information should
simply see thelogppmessage as the summary.Handling MessagesIf you’re usinglogpp, chances are you want to do something useful or
clever with the detail information. To accomplish that you can create
your own logging handler. If your custom handler is only interested in
logpp messages, you can extend theLogppHandlerand override theemit_logpp()method. The base class will perform checks to make sure that only
logging messages that are instances of theLogppMessageclass are passed to this method.Putting It All TogetherThe sample below briefly demonstrates the creation of a custom log
handler and should give you an idea of what to expect from such a
facility.importloggingfromlogpp.loggingimportmsg,LogppMessage,LogppHandler# Create a custom handler.classCustomLogppHandler(LogppHandler):defemit_logpp(self,msg_:LogppMessage):print(f'SUMMARY:{msg_.summary}')print(f'DETAILS:{msg_.detail}')logging.basicConfig(level=logging.INFO)# Add the custom handler to the logger (just as you would with any handler).logging.getLogger().addHandler(CustomLogppHandler())# Log a message to be handled by the custom handler.logging.info(msg('The weather is currently sunny with a temperature of 25°C.',{'conditions':'sunny','temperature':25}))# Log a message that will be ignored by the custom handler.logging.info('This message will be ignored by the custom handler.')Using theLogppMixinLet’s say you have a class that needs to log its activities. Often
you’ll want to use a named logger. This can involve a few lines of
boiler plate which can be a bit tedious to produce in every class. By
extending theLogppMixinyour class gains thelogger()function which returns a logger with a name that reflects the name of
the class (though you can override that behavior by adding a__loggername__attribute to the class).importloggingfromlogpp.loggingimportLogppMixin# Just so we may demonstrate the use of the mixin, here's a base class# that has nothing to do with logging from which we can inherit.classSampleBaseClass(object):pass# Now let's create a class that extends the sample base class, but# which also mixes in the logging facility.classLoggableClass(SampleBaseClass,LogppMixin):deflog_something(self):self.logger().info('Hello world!')# Set up basic logginglogging.basicConfig(level=logging.INFO)# Create a new instance of the mixed-in class...loggable=LoggableClass()# ...and ask it to log something.loggable.log_something()ResourcesWould you like to learn more? Check out the links below!Read the DocsLogging HOWTOAuthorsPat Daburu-Initial work-githubSee also the list ofcontributorswho participated in this project.LicenseThis project is licensed under the MIT License - see theLICENSE.mdfile for details