ó
L]c           @   sÚ   d  Z  d d l Z d d l m Z m Z m Z m Z m Z d d l Z d d l m	 Z	 m
 Z
 m Z d Z d e j f d     YZ d e j f d	     YZ x9 d
 j   D]+ Z e e j e  Z e e e d    q§ Wd S(   sn  pyzmq logging handlers.

This mainly defines the PUBHandler object for publishing logging messages over
a zmq.PUB socket.

The PUBHandler can be used with the regular logging module, as in::

    >>> import logging
    >>> handler = PUBHandler('tcp://127.0.0.1:12345')
    >>> handler.root_topic = 'foo'
    >>> logger = logging.getLogger('foobar')
    >>> logger.setLevel(logging.DEBUG)
    >>> logger.addHandler(handler)

After this point, all messages logged by ``logger`` will be published on the
PUB socket.

Code adapted from StarCluster:

    http://github.com/jtriley/StarCluster/blob/master/starcluster/logger.py
i˙˙˙˙N(   t   INFOt   DEBUGt   WARNt   ERRORt   FATAL(   t   bytest   unicodet
   cast_bytess   ::t
   PUBHandlerc           B   s   e  Z d  Z d Z d Z i e j d  e j 6e j d  e j	 6e j d  e j
 6e j d  e j 6e j d  e j 6Z d d  Z d   Z d   Z RS(	   s|  A basic logging handler that emits log messages through a PUB socket.

    Takes a PUB socket already bound to interfaces or an interface to bind to.

    Example::

        sock = context.socket(zmq.PUB)
        sock.bind('inproc://log')
        handler = PUBHandler(sock)

    Or::

        handler = PUBHandler('inproc://loc')

    These are equivalent.

    Log messages handled by this handler are broadcast with ZMQ topics
    ``this.root_topic`` comes first, followed by the log level
    (DEBUG,INFO,etc.), followed by any additional subtopics specified in the
    message by: log.debug("subtopic.subsub::the real message")
    t    s4   %(levelname)s %(filename)s:%(lineno)d - %(message)s
s   %(message)s
sC   %(levelname)s %(filename)s:%(lineno)d - %(message)s - %(exc_info)s
c         C   s~   t  j j |   t | t j  r= | |  _ |  j j |  _ n= | pL t j	   |  _ |  j j t j
  |  _ |  j j |  d  S(   N(   t   loggingt   Handlert   __init__t
   isinstancet   zmqt   Sockett   sockett   contextt   ctxt   Contextt   PUBt   bind(   t   selft   interface_or_socketR   (    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pyR   I   s    	c         C   s   |  j  | j j |  S(   s   Format a record.(   t
   formatterst   levelnot   format(   R   t   record(    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pyR   S   s    c         C   sň   y" | j  j t d  \ } | _  Wn t k
 r; d } n Xy t |  j |   } Wn t k
 rv |  j |  d SXg  } |  j r | j |  j  n  | j | j	  | rż | j |  n  d j
 d   | D  } |  j j | | g  d S(   s    Emit a log message on my socket.i   R	   Nt   .c         s   s   |  ] } t  |  Vq d  S(   N(   R   (   t   .0t   t(    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pys	   <genexpr>m   s    (   t   msgt   splitt   TOPIC_DELIMt	   ExceptionR   R   t   handleErrort
   root_topict   appendt	   levelnamet   joinR   t   send_multipart(   R   R   t   topict   bmsgt
   topic_listt   btopic(    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pyt   emitW   s"    "
	N(   t   __name__t
   __module__t   __doc__R$   t   NoneR   R
   t	   FormatterR   R    R   R   t   CRITICALR   R   R   R-   (    (    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pyR   %   s    
	t   TopicLoggerc           B   s   e  Z d  Z d   Z RS(   s   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')
    c         O   s*   t  j j |  | d | | f | |  d S(   s  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)
        s   %s::%sN(   R
   t   Loggert   log(   R   t   levelR)   R   t   argst   kwargs(    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pyR6      s    	(   R.   R/   R0   R6   (    (    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pyR4   r   s   s'   debug warn warning error critical fatalc         O   s   t  |  | | t | | |  S(   N(   t   methR!   (   R   R7   R)   R   R8   R9   (    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pyt   <lambda>   s    (   R0   R
   R    R   R   R   R   R   t   zmq.utils.strtypesR   R   R   R!   R   R   R5   R4   R    t   namet   getattrR:   t   setattr(    (    (    s/   lib/python2.7/site-packages/zmq/log/handlers.pyt   <module>   s   (M	