class_docstr: A simple wrapper that takes an additional argument to log methods.
  
  All the regular methods exist, but instead of one msg argument, two
  arguments: topic, msg are passed.
  
  That is::
  
      logger.debug('msg')
  
  Would become::
  
      logger.debug('topic.sub', 'msg')
docstr: Log 'msg % args' with level and topic.
  
  To pass exception information, use the keyword argument exc_info
  with a True value::
  
      logger.log(level, "zmq.fun", "We have a %s",
              "mysterious problem", exc_info=1)
docstr_tok: ["Log","'msg","%","args","'","with","level","and","topic",".","To","pass","exception","information",",","use","the","keyword","argument","exc_info","with","a","True","value",":",":","logger.log","(","level",",","``","zmq.fun","''",",","``","We","have","a","%","s","''",",","``","mysterious","problem","''",",","exc_info=1",")"]
code: def log(self, level, topic, msg, *args, **kwargs):
      """Log 'msg % args' with level and topic.
  
      To pass exception information, use the keyword argument exc_info
      with a True value::
  
          logger.log(level, "zmq.fun", "We have a %s",
                  "mysterious problem", exc_info=1)
      """
      logging.Logger.log(
          self, level, f"{topic}{TOPIC_DELIM}{msg}", *args, **kwargs
      )
  
file_path: catboost/contrib/python/pyzmq/py3/zmq/log/handlers.py
imports: import logging
  from copy import copy
  from typing import Optional, Union
  import zmq
label_desc: Use image node_id 1 for calling the TopicLogger obj's underlying member method code with example usage: obj.log(level, topic, msg) without return types