File: //usr/lib/python3/dist-packages/twisted/logger/__pycache__/_logger.cpython-38.pyc
U
W[6% � @ sZ d Z ddlmZ ddlmZ ddlmZ ddlmZmZ G dd� de �Z
e
� Zd d
� ZdS )z
Logger class.
� )�time)�currentframe)�Failure� )�InvalidLogLevelError�LogLevelc @ s� e Zd ZdZedd� �Zddd�Zddd�Zd d
� Zddd�Z de
jfd
d�Zddd�Z
ddd�Zddd�Zddd�Zd dd�ZdS )!�Loggera�
A L{Logger} emits log messages to an observer. You should instantiate it
as a class or module attribute, as documented in L{this module's
documentation <twisted.logger>}.
@type namespace: L{str}
@ivar namespace: the namespace for this logger
@type source: L{object}
@ivar source: The object which is emitting events via this logger
@type: L{ILogObserver}
@ivar observer: The observer that this logger will send events to.
c C s, zt d�jd W S tk
r& Y dS X dS )z�
Derive a namespace from the module containing the caller's caller.
@return: the fully qualified python name of a module.
@rtype: L{str} (native string)
� �__name__z <unknown>N)r � f_globals�KeyError� r
r
�8/usr/lib/python3/dist-packages/twisted/logger/_logger.py�_namespaceFromCallingContext! s z#Logger._namespaceFromCallingContextNc C sB |dkr| � � }|| _|| _|dkr8ddlm} || _n|| _dS )a�
@param namespace: The namespace for this logger. Uses a dotted
notation, as used by python modules. If not L{None}, then the name
of the module of the caller is used.
@type namespace: L{str} (native string)
@param source: The object which is emitting events via this
logger; this is automatically set on instances of a class
if this L{Logger} is an attribute of that class.
@type source: L{object}
@param observer: The observer that this logger will send events to.
If L{None}, use the L{global log publisher <globalLogPublisher>}.
@type observer: L{ILogObserver}
Nr )�globalLogPublisher)r � namespace�sourceZ_globalr �observer)�selfr r r r r
r
r �__init__/ s zLogger.__init__c C s2 |dkr|}n|}| j d�|j|jg�|| jd�S )a�
When used as a descriptor, i.e.::
# File: athing.py
class Something(object):
log = Logger()
def hello(self):
self.log.info("Hello")
a L{Logger}'s namespace will be set to the name of the class it is
declared on. In the above example, the namespace would be
C{athing.Something}.
Additionally, its source will be set to the actual object referring to
the L{Logger}. In the above example, C{Something.log.source} would be
C{Something}, and C{Something().log.source} would be an instance of
C{Something}.
N�.)r )� __class__�join�
__module__r
r )r Zoself�typer r
r
r �__get__L s �zLogger.__get__c C s d| j j| jf S )Nz<%s %r>)r r
r )r r
r
r �__repr__k s zLogger.__repr__c K st |t �� kr*| jdtt|��|| d� dS |}|j| || j| j|t� d� d|krf|d � | | j
f� | �
|� dS )a
Emit a log event to all log observers at the given level.
@param level: a L{LogLevel}
@param format: a message format using new-style (PEP 3101)
formatting. The logging event (which is a L{dict}) is
used to render this format string.
@param kwargs: additional key/value pairs to include in the event.
Note that values which are later mutated may result in
non-deterministic behavior from observers that schedule work for
later execution.
z:Got invalid log level {invalidLevel!r} in {logger}.emit().)ZinvalidLevelZloggerN)Z
log_loggerZ log_levelZ
log_namespaceZ
log_sourceZ
log_formatZlog_timeZ log_trace)r Z
iterconstants�failurer r �updater r r �appendr )r �level�format�kwargsZeventr
r
r �emito s(
� �zLogger.emitc K s* |dkrt � }| j||fd|i|�� dS )a
Log a failure and emit a traceback.
For example::
try:
frob(knob)
except Exception:
log.failure("While frobbing {knob}", knob=knob)
or::
d = deferredFrob(knob)
d.addErrback(lambda f: log.failure, "While frobbing {knob}",
f, knob=knob)
This method is generally meant to capture unexpected exceptions in
code; an exception that is caught and handled somehow should be logged,
if appropriate, via L{Logger.error} instead. If some unknown exception
occurs and your code doesn't know how to handle it, as in the above
example, then this method provides a means to describe the failure in
nerd-speak. This is done at L{LogLevel.critical} by default, since no
corrective guidance can be offered to an user/administrator, and the
impact of the condition is unknown.
@param format: a message format using new-style (PEP 3101) formatting.
The logging event (which is a L{dict}) is used to render this
format string.
@param failure: a L{Failure} to log. If L{None}, a L{Failure} is
created from the exception in flight.
@param level: a L{LogLevel} to use.
@param kwargs: additional key/value pairs to include in the event.
Note that values which are later mutated may result in
non-deterministic behavior from observers that schedule work for
later execution.
NZlog_failure)r r# )r r! r r r"