U
    d#                     @   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 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)isatty)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-9cz4377o/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__7   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)r1   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.   logfiler9   Zredirect_levelr1   r4   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.   1r5   )ZCELERY_LOG_REDIRECTZCELERY_LOG_REDIRECT_LEVEL)redirect_stdouts_to_loggerr   r:   r;   r   r<   )r   r.   r   r#   r#   r$   r9   P   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   r1   celerycelery.taskrB   rE   loggerr.   r@   r   r1   )r1   r   r5   )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<   r:   r;   r   )r   r.   r@   r   r1   r4   kwargsZ	receiversrootrT   Zlogfile_namer#   r#   r$   r8   Y   sz    

   



         zLogging.setup_logging_subsystemc                 K   s.   |d k	r*| j ||||f| |r*|| d S r*   )setup_handlerssetLevel)r   rI   r@   r.   r   r1   rX   r#   r#   r$   rQ      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.
        rG   	formatterNrH   )r   r.   r0   rL   rZ   r   r   r[   int	propagater   Zafter_setup_task_loggerrN   )r   r.   r@   r   r1   r^   rX   rI   r#   r#   r$   rS      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   rI   r.   r`   ra   proxyr#   r#   r$   rD      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tjS |S )NF)r1   r+   Z
IS_WINDOWSr	   r_   ra   )r   r1   r@   r#   r#   r$   rL      s    zLogging.supports_colorc                 C   s   t | ||dS )N)enabled)r   rL   )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   rI   r@   r   r1   r\   rX   handlerr#   r#   r$   rZ      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*   )rW   r,   NullHandler).0hr#   r#   r$   	<genexpr>   s   z'Logging._has_handler.<locals>.<genexpr>)anyrP   r   rI   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_configuredrF   c                 K   s   t |S r*   )r   )r   r   rX   r#   r#   r$   get_default_logger   s    zLogging.get_default_loggerc                 C   s   | j S r*   rK   )r   r#   r#   r$   rJ      s    zLogging.already_setupc                 C   s
   || _ d S r*   rw   )r   Z	was_setupr#   r#   r$   rJ      s    )NNFr3   NN)NrB   )NNNNN)NNNNF)NTT)NN)NN)N)rF   )r%   r&   r'   r(   rK   r2   rA   r9   r8   rQ   rS   rD   rL   r   r
   rZ   re   rt   rd   rv   r   rJ   setterr#   r#   r#   r$   r   /   sD         

	    
=    
    



	


r   )%r(   r,   r:   r_   r=   logging.handlersr   Zkombu.utils.encodingr   rF   r   Zcelery._stater   Zcelery.exceptionsr   r   Zcelery.localr   Zcelery.platformsr	   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$    