o
    dA:                     @   s~  d dl Z d dlZd dlZd dlZdejj_d dlmZ d dlm	Z	 d dl
Z
d dlZd dlZd dlZd dlZd dlmZ i dddd	d
ddddddd dddddddddddddddddd d!d"d#d$d%d&d'd(d)Zedd*d+d,gd-d+d.gd/d0d1d+d,gd/d2d1d3d4d5d6d7d4d5d8d7d9d5d:d;d<d=id>Zd?d@ ZG dAdB dBeZdCdD ZG dEdF dFeZdS )G    N   )
dictConfig)
fileConfig)utilauth   authpriv
   cron	   daemon   ftp   kernlpr   mail   news   securitysyslog   useruucp   local0   local1   local2   local3               )local4local5local6local7FINFOconsole)levelhandlerserror_consoleTgunicorn.error)r/   r0   	propagatequalnamegunicorn.access)r2   r5   zlogging.StreamHandlerZgenericzext://sys.stdout)class	formatterstreamzext://sys.stderr)r.   r1   5%(asctime)s [%(process)d] [%(levelname)s] %(message)s[%Y-%m-%d %H:%M:%S %z]zlogging.Formatter)formatdatefmtr6   )versiondisable_existing_loggersrootloggersr0   
formattersc                  C   s    t j} | jj }dd |D S )z get list of all loggers c                 S   s   g | ]}t |qS  )logging	getLogger).0namerB   rB   E/app/.heroku/python/lib/python3.10/site-packages/gunicorn/glogging.py
<listcomp>^   s    zloggers.<locals>.<listcomp>)rC   r?   manager
loggerDictkeys)r?   existingrB   rB   rG   r@   Z   s   r@   c                       s$   e Zd Zdd Z fddZ  ZS )	SafeAtomsc                 C   sD   t |  | D ]\}}t|tr|dd| |< q	|| |< q	d S )N"z\")dict__init__items
isinstancestrreplace)selfatomskeyvaluerB   rB   rG   rP   c   s   


zSafeAtoms.__init__c                    sB   | dr| }|| v rt |S dS || v rt |S dS )N{-)
startswithlowersuper__getitem__)rU   kkl	__class__rB   rG   r^   k   s   
zSafeAtoms.__getitem__)__name__
__module____qualname__rP   r^   __classcell__rB   rB   ra   rG   rM   a   s    rM   c                 C   sL  |  dr)d }| dd}t|dkr |d } |d dkr tj}|| dd fS |  dr9| dd } tj}n|  drI| dd } tj}ntd	d
| v rcd| v rc| dd dd   }nd| v rq| dd  }n| dkrxd}n|  }| dd } d| v r| ddd }| std| t	|}nd}|||ffS )Nzunix://#r   r   r   Zdgramzudp://ztcp://zinvalid syslog address[]: 	localhostz%r is not a valid port number.i  )
r[   splitlensocket
SOCK_DGRAMSOCK_STREAMRuntimeErrorr\   isdigitint)addrZ	sock_typepartssocktypehostportrB   rB   rG   parse_syslog_addressx   s<   



r{   c                   @   s   e Zd ZejejejejejdZ	ejZ
dZdZdZdZeZdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd+d%d&Z d'd( Z!d)d* Z"d$S ),Logger)criticalerrorwarninginfodebugr9   r:   z%(message)sz[%(process)d] %(message)sc                 C   sX   t d| _d| j_t d| _d| j_g | _g | _d | _t	 | _
|| _| | d S )Nr2   Fr5   )rC   rD   	error_logr3   
access_logZerror_handlersZaccess_handlerslogfile	threadingLocklockcfgsetup)rU   r   rB   rB   rG   rP      s   
zLogger.__init__c                 C   s  | j |j tj| _| j| j | jtj | j	j
rO|jdkrOtjtjfD ]}|  q)t|jd| _t| j tj  t| j tj  | | j|jt| j| j |jd urs| j| j|jt| jtjd |jr| | j|| jd |js| | j|| jd |jrt ! }|"|j zt#| W d S  t$t%t&t'fy } zt(t)|d }~ww |j*rtj+,|j*rt ! }|j*|d< tj+-|j*|d< t.|j*|dd	 d S d
}t(||j* d S )NrZ   a+)fmtr8   r~   access__file__hereF)defaultsr>   z Error: log config '%s' not found)/
LOG_LEVELSgetloglevelr\   rC   r-   r   setLevelr   r   capture_outputerrorlogsysstdoutstderrflushopenr   osdup2fileno_set_handler	Formatter	error_fmtr<   	accesslog
access_fmtr   _set_syslog_handler
syslog_fmt!disable_redirect_access_to_sysloglogconfig_dictCONFIG_DEFAULTScopyupdater   AttributeErrorImportError
ValueError	TypeErrorrs   rS   	logconfigpathexistsdirnamer   )rU   r   r8   configexcr   msgrB   rB   rG   r      sd   



zLogger.setupc                 O      | j j|g|R i | d S N)r   r}   rU   r   argskwargsrB   rB   rG   r}         zLogger.criticalc                 O   r   r   )r   r~   r   rB   rB   rG   r~     r   zLogger.errorc                 O   r   r   )r   r   r   rB   rB   rG   r     r   zLogger.warningc                 O   r   r   )r   r   r   rB   rB   rG   r     r   zLogger.infoc                 O   r   r   )r   r   r   rB   rB   rG   r   
  r   zLogger.debugc                 O   r   r   )r   	exceptionr   rB   rB   rG   r     r   zLogger.exceptionc                 O   s>   t |tr| j| tj}| jj||g|R i | d S r   )	rR   rS   r   r   r\   rC   r-   r   log)rU   Zlvlr   r   r   rB   rB   rG   r     s   
 z
Logger.logc           
      C   s  |j }t|tr|ddd }i d|ddddd| |p"dd	|  d
d|d |d |d f d|d|dd|dd|dd|ddt|dddur_t|jp`ddt|ddd|ddd|ddd|j	d|j	d |j
 d |j	d! t|j
d!  d"|j	|j
f d#t  d$}t|d%r|j}n|}t|d&r| }|d'd( |D  |j}t|d&r| }|d)d( |D  | }	|d*d( |	D  |S )+z' Gets atoms for log formating.
        Nr   r   hZREMOTE_ADDRrZ   lutrz%s %s %sREQUEST_METHODZRAW_URIZSERVER_PROTOCOLsmUZ	PATH_INFOqZQUERY_STRINGHbsentBfZHTTP_REFERERaZHTTP_USER_AGENTTDi@B Mi  z%d.%06dz<%s>)LpheadersrQ   c                 S      i | ]\}}d |   |qS )z{%s}ir\   rE   r_   vrB   rB   rG   
<dictcomp><      z Logger.atoms.<locals>.<dictcomp>c                 S   r   )z{%s}or   r   rB   rB   rG   r   C  r   c                 S   r   )z{%s}er   r   rB   rB   rG   r   G  r   )statusrR   rS   rn   r   	_get_usernowgetattrr   secondsmicrosecondsru   r   getpidhasattrr   rQ   r   )
rU   respreqenvironrequest_timer   rV   Zreq_headersZresp_headersZenviron_variablesrB   rB   rG   rV     sr   


	







zLogger.atomsc                 C   s~   | j js| j js| j js| j jr| j jrdS | | ||||}z| j	| j j
| W dS  ty>   | t  Y dS w )z\ See http://httpd.apache.org/docs/2.0/logs.html#combined
        for format details
        N)r   r   r   r   r   r   atoms_wrapper_classrV   r   r   Zaccess_log_format	Exceptionr~   	traceback
format_exc)rU   r   r   r   r   Z
safe_atomsrB   rB   rG   r   K  s    zLogger.accessc                 C   s
   t dS )z) return date in Apache Common Log Format z[%d/%b/%Y:%H:%M:%S %z])timestrftime)rU   rB   rB   rG   r   a  s   
z
Logger.nowc              
   C   s  | j jrT| j jdkrTtjtjfD ]}|  q| j2 | jd ur%| j	  t
| j jd| _t| j tj  t| j tj  W d    n1 sOw   Y  t D ]*}|jD ]$}t|tjr|  z|jru|	  | |_W |  q\|  w q\qWd S )NrZ   r   )r   r   r   r   r   r   r   r   r   closer   r   r   r   r@   r0   rR   rC   FileHandleracquirer8   _openrelease)rU   r8   r   handlerrB   rB   rG   reopen_filese  s.   





zLogger.reopen_filesc              
   C   s^   t  D ])}|jD ]#}t|tjr+|  z|jr t|j	  W |
  q|
  w qqd S r   )r@   r0   rR   rC   r   r   r8   r   close_on_execr   r   )rU   r   r   rB   rB   rG   r   |  s   

zLogger.close_on_execc                 C   s$   |j D ]}t|ddr|  S qd S )N	_gunicornF)r0   r   )rU   r   r   rB   rB   rG   _get_gunicorn_handler  s
   
zLogger._get_gunicorn_handlerNc                 C   s   |  |}|r|j| |d urL|dkrt|}n"t| t|}zt	|j
| jj| jj W n	 ty<   Y nw || d|_|| d S d S )NrZ   T)r   r0   removerC   StreamHandlerr   Zcheck_is_writeabler   r   chownbaseFilenamer   r   groupOSErrorsetFormatterr   
addHandler)rU   r   outputr   r8   r   rB   rB   rG   r     s"   



zLogger._set_handlerc           
      C   s   |j p	|jdd}d||f }td||f }z	t|j  }W n ty-   t	dw t
|j\}}tjj|||d}	|	| d|	_||	 d S )Nrj   .zgunicorn.%s.%sz%s: %szunknown facility name)addressfacilityrx   T)Zsyslog_prefixZ	proc_namerT   rC   r   SYSLOG_FACILITIESZsyslog_facilityr\   KeyErrorrs   r{   Zsyslog_addrr0   SysLogHandlerr   r   r   )
rU   r   r   r   rF   prefixr   rx   rv   r   rB   rB   rG   r     s   
zLogger._set_syslog_handlerc              
   C   s   d }| d}|r^| dr^|dd}t|dkr^zt|d  d}|	d}|dd}W n t
tjtfyS } z| d| |W  Y d }~S d }~ww t|dkr^|d	 }|S )
NZHTTP_AUTHORIZATIONbasic r   r   zutf-8rj   zCouldn't get username: %sr   )r   r\   r[   rn   ro   base64	b64decodestripencodedecoder   binasciiErrorUnicodeDecodeErrorr   )rU   r   r   Z	http_authr   r   rB   rB   rG   r     s"   

zLogger._get_userr   )#rc   rd   re   rC   CRITICALERRORWARNINGr-   DEBUGr   r   r   r<   r   r   rM   r   rP   r   r}   r~   r   r   r   r   r   rV   r   r   r   r   r   r   r   r   rB   rB   rB   rG   r|      s>    96
r|   )r  r  r   rC   r|   rI   emittedNoHandlerWarninglogging.configr   r   r   rp   r   r   r   Zgunicornr   r  rO   r   r@   rM   r{   objectrB   rB   rB   rG   <module>   s   
	

*.