U
    .ek#                     @   s   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	lmZmZmZmZmZmZ dd
lmZ ddlmZ dZejddZ G dd deZ!G dd dZ"dS )zLogging configuration.

The Celery instances logging section: ``Celery.log``.

Sets up logging for the worker and other programs,
redirects standard outs, colors log output, patches logging
related compatibility fixes, and so on.
    N)WatchedFileHandler)set_default_encoding_file)signals)get_current_task)CDeprecationWarningCPendingDeprecationWarning)class_property)ColorFormatterLoggingProxy
get_loggerget_multiprocessing_loggermlevelreset_multiprocessing_logger)node_format)colored)TaskFormatterLoggingMP_LOGFc                       s    e Zd ZdZ fddZ  ZS )r   z1Formatter for tasks, adding the task name and id.c                    sP   t  }|r(|jr(|jj|jj|jd n|jdd |jdd t |S )N)task_id	task_namer   z???r   )	r   request__dict__updateidname
setdefaultsuperformat)selfrecordZtask	__class__ 2/tmp/pip-unpacked-wheel-f4liivr4/celery/app/log.pyr   "   s    
zTaskFormatter.format)__name__
__module____qualname____doc__r   __classcell__r"   r"   r    r#   r      s   r   c                   @   s   e Zd ZdZdZdd Zd'ddZd(d
dZd)ddZdd Z	d*ddZ
d+ddZd,ddZd-ddZefddZd.ddZdd Zdd  Zd/d"d#Zed$d% Zejd&d% ZdS )0r   z$Application logging setup (app.log).Fc                 C   s:   || _ ttj| _| j jj| _| j jj| _	| j jj
| _d S N)appr   loggingWARNloglevelconfZworker_log_formatr   Zworker_task_log_formattask_formatZworker_log_colorcolorize)r   r*   r"   r"   r#   __init__5   s
    zLogging.__init__NWARNINGc                 C   s~   t |}| j||||d}|s,|r,| | tjj|r>t|nd|rLt|ndd tjdt	d tjdt
d td |S )N)r0   hostname )ZCELERY_LOG_LEVELZCELERY_LOG_FILEalways)categoryT)r   setup_logging_subsystemredirect_stdoutsosenvironr   strwarningsfilterwarningsr   r   r+   captureWarnings)r   r-   logfiler8   Zredirect_levelr0   r3   Zhandledr"   r"   r#   setup<   s"       

zLogging.setupcelery.redirectedc                 C   s.   | j t||d tjjdt|p"dd d S )N)r-   1r4   )ZCELERY_LOG_REDIRECTZCELERY_LOG_REDIRECT_LEVEL)redirect_stdouts_to_loggerr   r9   r:   r   r;   )r   r-   r   r"   r"   r#   r8   M   s     
zLogging.redirect_stdoutsc              	   K   sb  | j r
d S |r|rt||}dt_t|p,| j}|p8| j}| ||}t  t	j
jd ||||d}|st }| jjjrg |_g td_g td_g td_| j|||||f| | jt |tr|ntj||f| t	jjd |||||d | j|||d zt jd j}	W n ttfk
r*   Y n
X t|	 t|trD|nd	}
tj j!t||
|d
 |S )NT)senderr-   r?   r   r0   celerycelery.taskrA   rD   loggerr-   r?   r   r0   )r0   r   r4   )Z_MP_FORK_LOGLEVEL_Z_MP_FORK_LOGFILE_Z_MP_FORK_LOGFORMAT_)"already_setupr   r   _setupr   r-   r   supports_colorr   r   setup_loggingsendr+   	getLoggerr*   r.   Zworker_hijack_root_loggerhandlersr   _configure_loggerr   r   ERRORZafter_setup_loggersetup_task_loggersstreamAttributeError
IndexErrorr   
isinstancer;   r9   r:   r   )r   r-   r?   r   r0   r3   kwargsZ	receiversrootrS   Zlogfile_namer"   r"   r#   r7   V   sz    

   



         zLogging.setup_logging_subsystemc                 K   s.   |d k	r*| j ||||f| |r*|| d S r)   )setup_handlerssetLevel)r   rH   r?   r-   r   r0   rW   r"   r"   r#   rP      s    
zLogging._configure_loggerc                 K   st   t |p
| j}|p| j}| ||}| jtd|||fdti|}|| t||_	t
jjd|||||d |S )zSetup the task logger.

        If `logfile` is not specified, then `sys.stderr` is used.

        Will return the base task logger object.
        rF   	formatterNrG   )r   r-   r/   rK   rY   r   r   rZ   int	propagater   Zafter_setup_task_loggerrM   )r   r-   r?   r   r0   r]   rW   rH   r"   r"   r#   rR      s0    
  

   zLogging.setup_task_loggersTc                 C   s"   t ||}|r|t_|r|t_|S )a  Redirect :class:`sys.stdout` and :class:`sys.stderr` to logger.

        Arguments:
            logger (logging.Logger): Logger instance to redirect to.
            loglevel (int, str): The loglevel redirected message
                will be logged as.
        )r
   sysstdoutstderr)r   rH   r-   r_   r`   proxyr"   r"   r#   rC      s    	
z"Logging.redirect_stdouts_to_loggerc                 C   s@   |d kr| j n|}| jjrdS |s*|d kr<|d ko:tj S |S )NF)r0   r*   Z
IS_WINDOWSr^   r`   isatty)r   r0   r?   r"   r"   r#   rK      s    zLogging.supports_colorc                 C   s   t | ||dS )N)enabled)r   rK   )r   r?   rc   r"   r"   r#   r      s    zLogging.coloredc                 K   s8   |  |r|S | |}||||d || |S )N)Z	use_color)_is_configured_detect_handlersetFormatter
addHandler)r   rH   r?   r   r0   r[   rW   handlerr"   r"   r#   rY      s    


zLogging.setup_handlersc                 C   s2   |dkrt jn|}t|dr&t|S t|ddS )z@Create handler from filename, an open stream or `None` (stderr).Nwritezutf-8)encoding)r^   
__stderr__hasattrr+   StreamHandlerr   )r   r?   r"   r"   r#   re      s    

zLogging._detect_handlerc                 C   s   t dd |jpg D S )Nc                 s   s   | ]}t |tj V  qd S r)   )rV   r+   NullHandler).0hr"   r"   r#   	<genexpr>   s   z'Logging._has_handler.<locals>.<genexpr>)anyrO   r   rH   r"   r"   r#   _has_handler   s    zLogging._has_handlerc                 C   s   |  |ot|dd S )NZ_rudimentary_setupF)rt   getattrrs   r"   r"   r#   rd      s
      zLogging._is_configuredrE   c                 K   s   t |S r)   )r   )r   r   rW   r"   r"   r#   get_default_logger   s    zLogging.get_default_loggerc                 C   s   | j S r)   rJ   )r   r"   r"   r#   rI      s    zLogging.already_setupc                 C   s
   || _ d S r)   rw   )r   Z	was_setupr"   r"   r#   rI      s    )NNFr2   NN)NrA   )NNNNN)NNNNF)NTT)NN)NN)N)rE   )r$   r%   r&   r'   rJ   r1   r@   r8   r7   rP   rR   rC   rK   r   r	   rY   re   rt   rd   rv   r   rI   setterr"   r"   r"   r#   r   -   sD         

	    
=    
    



	


r   )#r'   r+   r9   r^   r<   logging.handlersr   Zkombu.utils.encodingr   rE   r   Zcelery._stater   Zcelery.exceptionsr   r   Zcelery.localr   Zcelery.utils.logr	   r
   r   r   r   r   Zcelery.utils.nodenamesr   Zcelery.utils.termr   __all__r:   getr   r   r   r"   r"   r"   r#   <module>   s"    