o
    5׾gy                     @   s   d dl 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 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dlmZ edd	ZG d
d deZdS )    N)
namedtuple)AnyCallableDictIterableListTuple   )AbstractAccessLogger)BaseRequest)StreamResponse	KeyMethodz
key methodc                       sH  e Zd ZU dZdddddddd	d
dddZdZedZedZ	i Z
eeeeee f f ed< efdejdeddf fddZdedeeee f fddZedededededef
ddZedededededef
d d!Zededededefd"d#Zededededefd$d%Zededededefd&d'Zededededefd(d)Zededededefd*d+Z ededededefd,d-Z!ededededefd.d/Z"ededededefd0d1Z#ededededefd2d3Z$dededede%eee&eeegef f  fd4d5Z'dedededdfd6d7Z(  Z)S )8AccessLoggera  Helper object to log access.

    Usage:
        log = logging.getLogger("spam")
        log_format = "%a %{User-Agent}i"
        access_logger = AccessLogger(log, log_format)
        access_logger.log(request, response, time)

    Format:
        %%  The percent sign
        %a  Remote IP-address (IP-address of proxy if using reverse proxy)
        %t  Time when the request was started to process
        %P  The process ID of the child that serviced the request
        %r  First line of request
        %s  Response status code
        %b  Size of response in bytes, including HTTP headers
        %T  Time taken to serve the request, in seconds
        %Tf Time taken to serve the request, in seconds with floating fraction
            in .06f format
        %D  Time taken to serve the request, in microseconds
        %{FOO}i  request.headers['FOO']
        %{FOO}o  response.headers['FOO']
        %{FOO}e  os.environ['FOO']

    remote_addressrequest_start_time
process_idfirst_request_lineresponse_statusresponse_sizerequest_timerequest_time_fracrequest_time_microrequest_headerresponse_header)atPrsbTTfDioz/%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"z.%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbOD]|Tf?)z(%[^s])_FORMAT_CACHElogger
log_formatreturnNc                    sD   t  j||d tj|}|s| |}|tj|< |\| _| _dS )zInitialise the logger.

        logger is a logger object to be used for logging.
        log_format is a string with apache compatible log format description.

        )r'   N)super__init__r   r%   getcompile_format_log_format_methods)selfr&   r'   _compiled_format	__class__ Y/var/www/html/backend_erp/backend_erp_env/lib/python3.10/site-packages/aiohttp/web_log.pyr*   ?   s   

zAccessLogger.__init__c                 C   s   t  }| j|D ]B}|d dkr'| j|d  }ttd|d  }t||}n| j|d  |d f}ttd|d  }t|t||d }|	| q	| j
d|}| j
d|}||fS )a  Translate log_format into form usable by modulo formatting

        All known atoms will be replaced with %s
        Also methods for formatting of those atoms will be added to
        _methods in appropriate order

        For example we have log_format = "%a %t"
        This format will be translated to "%s %s"
        Also contents of _methods will be
        [self._format_a, self._format_t]
        These method will be called and results will be passed
        to translated string format.

        Each _format_* method receive 'args' which is list of arguments
        given to self.log

        Exceptions are _format_e, _format_i and _format_o methods which
        also receive key name (by functools.partial)

        r	    r   z
_format_%s   z%sz%\1)list	FORMAT_REfindallLOG_FORMAT_MAPgetattrr   r   	functoolspartialappendsub
CLEANUP_RE)r/   r'   methodsatomformat_key1m
key_methodformat_key2r3   r3   r4   r,   O   s   zAccessLogger.compile_formatkeyrequestresponsetimec                 C   s   |d u rdS |j | dS )Nz(no headers)-headersr+   rG   rH   rI   rJ   r3   r3   r4   	_format_ix   s   zAccessLogger._format_ic                 C   s   |j | dS NrK   rL   rN   r3   r3   r4   	_format_o   s   zAccessLogger._format_oc                 C   s"   | d u rdS | j }|d ur|S dS rP   )remote)rH   rI   rJ   ipr3   r3   r4   	_format_a   s   zAccessLogger._format_ac                 C   s<   t t jtj d}t j |}|t j|d }|dS )N)secondsz[%d/%b/%Y:%H:%M:%S %z])datetimetimezone	timedeltatime_modnowstrftime)rH   rI   rJ   tzrZ   
start_timer3   r3   r4   	_format_t   s   
zAccessLogger._format_tc                 C   s   dt   S )Nz<%s>)osgetpidrH   rI   rJ   r3   r3   r4   	_format_P      zAccessLogger._format_Pc                 C   s(   | d u rdS d | j| j| jj| jjS )NrK   z{} {} HTTP/{}.{})formatmethodpath_qsversionmajorminorra   r3   r3   r4   	_format_r   s   zAccessLogger._format_rc                 C      |j S N)statusra   r3   r3   r4   	_format_s      zAccessLogger._format_sc                 C   rk   rl   )body_lengthra   r3   r3   r4   	_format_b   ro   zAccessLogger._format_bc                 C   s   t t|S rl   strroundra   r3   r3   r4   	_format_T   rc   zAccessLogger._format_Tc                 C   s   d| S )Nz%06fr3   ra   r3   r3   r4   
_format_Tf   s   zAccessLogger._format_Tfc                 C   s   t t|d S )Ni@B rr   ra   r3   r3   r4   	_format_D   s   zAccessLogger._format_Dc                    s    fdd| j D S )Nc                    s    g | ]\}}|| fqS r3   r3   ).0rG   re   ra   r3   r4   
<listcomp>   s     z-AccessLogger._format_line.<locals>.<listcomp>)r.   )r/   rH   rI   rJ   r3   ra   r4   _format_line   s   zAccessLogger._format_linec                 C   s   | j tjs	d S zE| |||}t }t }|D ]%\}}|| |jt	u r,|||< q|\}	}
|
|	i }|||
< |||	< q| j j| jt| |d W d S  ty^   | j d Y d S w )N)extrazError in logging)r&   isEnabledForloggingINFOrz   r7   dictr>   r2   rs   r+   infor-   tuple	Exception	exception)r/   rH   rI   rJ   fmt_infovaluesr{   rG   valuek1k2dctr3   r3   r4   log   s$   



 zAccessLogger.log)*__name__
__module____qualname____doc__r:   
LOG_FORMATrecompiler8   r@   r%   r   rs   r   r   r   __annotations__r}   Loggerr*   r,   staticmethodr   r   floatrO   rQ   rT   r^   rb   rj   intrn   rq   ru   rv   rw   r   r   rz   r   __classcell__r3   r3   r1   r4   r      s   
 

  )	

"r   )rV   r<   r}   r_   r   rJ   rY   collectionsr   typingr   r   r   r   r   r   abcr
   web_requestr   web_responser   r   r   r3   r3   r3   r4   <module>   s     
