
    !hK                     $   % S SK Jr  S SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
  S SKJrJrJrJr  S SKJr  S SKJr  S SKrS S	KJrJr  S S
KJr  \(       a  S SKJr  S SKJr  \R>                  " \ 5      r!    S&S jr" " S S\RF                  5      r$SSSS0SS0SS0SS0S.S.r%  S'     S(S jjr&Sq'S\(S'   S)S jr)S*S jr*S+S jr+S)S jr,S,S jr- " S S 5      r. " S! S"\R^                  5      r0    S-S# jr1 " S$ S%\Rd                  5      r3g).    )annotationsN)MutableMapping)
dictConfig)TracebackType)TYPE_CHECKINGAnyOptionalcast)log)Failure)Settings_SettingsKeyT)get_versions)Crawler)LogFormatterResultc                    [        U [        5      (       ab  U R                  (       d   eU R                  (       d   eU R                  U R                  [	        [
        [           U R                  5       5      4$ g)z'Extract exc_info from Failure instancesN)
isinstancer   typevaluer
   r	   r   getTracebackObject)failures    W/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/scrapy/utils/log.pyfailure_to_exc_infor      s^     '7##|||}}}LLMM-('*D*D*FG
 	

     c                  >   ^  \ rS rSrSrSSU 4S jjjrSS jrSrU =r$ )	TopLevelFormatter)   a  Keep only top level loggers' name (direct children from root) from
records.

This filter will replace Scrapy loggers' names with 'scrapy'. This mimics
the old Scrapy log behaviour and helps shortening long names.

Since it can't be set for just one logger (it won't propagate for its
children), it's going to be set in the root handler, with a parametrized
``loggers`` list where it should act.
c                B   > [         TU ]  5         U=(       d    / U l        g N)super__init__loggers)selfr"   	__class__s     r   r!   TopLevelFormatter.__init__5   s    ")-Rr   c                   ^ [        U4S jU R                   5       5      (       a$  TR                  R                  SS5      S   Tl        g)Nc              3  `   >#    U  H#  nTR                   R                  US -   5      v   M%     g7f).N)name
startswith).0loggerrecords     r   	<genexpr>+TopLevelFormatter.filter.<locals>.<genexpr>:   s'     O,v{{%%fsl33,s   +.r(      r   T)anyr"   r)   split)r#   r-   s    `r   filterTopLevelFormatter.filter9   s8    O$,,OOO ++++C3A6FKr   )r"   r   )r"   zlist[str] | None)r-   logging.LogRecordreturnbool)	__name__
__module____qualname____firstlineno____doc__r!   r3   __static_attributes____classcell__r$   s   @r   r   r   )   s    	0 0 r   r   r0   FlevelERRORDEBUG)filelockhpackscrapytwisted)versiondisable_existing_loggersr"   c                   [         R                  (       d  [        R                  " S5        [        R
                  " S5      nUR                  5         [        [        5        [        U [        5      (       d  U c  [        U 5      n U R                  S5      (       a(  [        [        R                  " S5      5      [         l        U(       a  [!        U 5        gg)aV  
Initialize logging defaults for Scrapy.

:param settings: settings used to create and configure a handler for the
    root logger (default: None).
:type settings: dict, :class:`~scrapy.settings.Settings` object or ``None``

:param install_root_handler: whether to install root logging handler
    (default: True)
:type install_root_handler: bool

This function does:

- Route warnings and twisted logging through Python standard logging
- Assign DEBUG and ERROR level to Scrapy and Twisted loggers respectively
- Route stdout to log if LOG_STDOUT setting is True

When ``install_root_handler`` is True (default), this function also
creates a handler for the root logger according to given settings
(see :ref:`topics-logging-settings`). You can override default options
using ``settings`` argument. When ``settings`` is empty or None, defaults
are used.
TrF   N
LOG_STDOUTstdout)syswarnoptionsloggingcaptureWarningstwisted_logPythonLoggingObserverstartr   DEFAULT_LOGGINGr   dictr   getboolStreamLogger	getLoggerrK   install_scrapy_root_handler)settingsinstall_root_handlerobservers      r   configure_loggingr\   S   s    6 ??%00;HNN(D!!X%5H%%%!'"3"3H"=>
#H- r   logging.Handler | None_scrapy_root_handlerc                R   [         bE  [         [        R                  R                  ;   a#  [        R                  R	                  [         5        [        R                  R                  [        R                  5        [        U 5      q [        R                  R                  [         5        g r   )	r^   rN   roothandlersremoveHandlersetLevelNOTSET_get_handler
addHandler)rY   s    r   rX   rX      sc     	( GLL$9$99""#78LL'..)'1LL01r   c                     [         $ r   )r^    r   r   get_scrapy_root_handlerri      s    r   c                d   U R                  S5      nU(       aA  U R                  S5      (       a  SOSnU R                  S5      n[        R                  " XUS9nOAU R                  S5      (       a  [        R                  " 5       nO[        R
                  " 5       n[        R                  " U R                  S5      U R                  S	5      S
9nUR                  U5        UR                  U R                  S5      5        U R                  S5      (       a  UR                  [        S/5      5        U$ )z1Return a log handler object according to settingsLOG_FILELOG_FILE_APPENDawLOG_ENCODING)modeencodingLOG_ENABLED
LOG_FORMATLOG_DATEFORMAT)fmtdatefmt	LOG_LEVELLOG_SHORT_NAMESrE   )getrU   rN   FileHandlerStreamHandlerNullHandler	FormattersetFormatterrc   	addFilterr   )rY   filenamerp   rq   handler	formatters         r   re   re      s    ||J'H&&'899ss<</%%hHM			-	(	('')%%'!!LL&=M0NI #X\\+./)**+XJ78Nr   c                   [         R                  S[        R                  U S   S.5        U R	                  S5      nU(       d  g [
        R                  " [        [        U5      5      SS9n[         R                  SU 35        g )Nz)Scrapy %(version)s started (bot: %(bot)s)BOT_NAME)rG   botLOG_VERSIONSF)
sort_dictsz
Versions:
)	r,   inforE   __version__getlistpprintpformatrT   r   )rY   softwareversionss      r   log_scrapy_infor      si    
KK3&&x
/CD /H~~d<#9:uMH
KK+hZ()r   c                 F   SSK Jn Jn  [        R	                  SUR
                  UR                  R                  5        [        XR                  5      (       aJ  [        R	                  SUR                  R
                  UR                  R                  R                  5        g g )Nr   asyncioreactorreactorzUsing reactor: %s.%szUsing asyncio event loop: %s.%s)twisted.internetr   r   r,   debugr9   r$   r8   r   AsyncioSelectorReactor_asyncioEventloopr   s     r   log_reactor_infor      sr    8
LL'););W=N=N=W=WX'@@AA-%%00%%//88	
 Br   c                  P    \ rS rSrSr\R                  4SS jjrS	S jrS
S jr	Sr
g)rV      zFake file-like stream object that redirects writes to a logger instance

Taken from:
    https://www.electricmonk.nl/log/2011/08/14/redirect-stdout-and-stderr-to-a-logger-in-python/
c                *    Xl         X l        SU l        g )N )r,   	log_levellinebuf)r#   r,   r   s      r   r!   StreamLogger.__init__   s    &,'r   c                    UR                  5       R                  5        H7  nU R                  R                  U R                  UR                  5       5        M9     g r   )rstrip
splitlinesr,   r   r   )r#   buflines      r   writeStreamLogger.write   s7    JJL++-DKKOODNNDKKM: .r   c                ^    U R                   R                   H  nUR                  5         M     g r   )r,   ra   flush)r#   hs     r   r   StreamLogger.flush   s    %%AGGI &r   )r   r   r,   N)r,   zlogging.Loggerr   int)r   strr6   Noner6   r   )r8   r9   r:   r;   r<   rN   INFOr!   r   r   r=   rh   r   r   rV   rV      s!     AH 
;r   rV   c                  :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )LogCounterHandler   z,Record log levels count into a crawler statsc                2   > [         TU ]  " U0 UD6  Xl        g r   )r    r!   crawler)r#   r   argskwargsr$   s       r   r!   LogCounterHandler.__init__   s    $)&) 'r   c                    SUR                    3nU R                  R                  (       d   eU R                  R                  R                  U5        g )Nz
log_count/)	levelnamer   stats	inc_value)r#   r-   snames      r   emitLogCounterHandler.emit   s@    V--./||!!!!$$U+r   )r   )r   r   r   r   r   r   )r-   r5   r6   r   )	r8   r9   r:   r;   r<   r!   r   r=   r>   r?   s   @r   r   r      s    6(, ,r   r   c                    U R                  S[        R                  5      nU R                  S5      =(       d    SnU R                  S5      (       d  [        [        [
        [        4   U 5      OU S   nXU4$ )z
Helper that takes the dictionary output from the methods in LogFormatter
and adapts it into a tuple of positional arguments for logger.log calls,
handling backward compatibility as well.
r@   msgr   r   )ry   rN   r   r
   rT   r   r   )logkwsr@   messager   s       r   logformatter_adapterr      s`     JJw-Ejj%2G 06zz&/A/A4S#X'vf~DD!!r   c                  *    \ rS rSr      SS jrSrg)SpiderLoggerAdapter   c                    [        UR                  S5      [        5      (       a!  US   R                  U R                  5        X4$ U R                  US'   X4$ )z9Method that augments logging with additional 'extra' dataextra)r   ry   r   updater   )r#   r   r   s      r   processSpiderLoggerAdapter.process   sQ     fjj)>::7O""4::. { #jjF7O{r   rh   N)r   r   r   zMutableMapping[str, Any]r6   z$tuple[str, MutableMapping[str, Any]])r8   r9   r:   r;   r   r=   rh   r   r   r   r      s    		 8		-	r   r   )r   r   r6   zFtuple[type[BaseException], BaseException, TracebackType | None] | None)NT)rY   z*Settings | dict[_SettingsKeyT, Any] | NonerZ   r7   r6   r   )rY   r   r6   r   )r6   r]   )rY   r   r6   zlogging.Handlerr   )r   r   r6   z1tuple[int, str, dict[str, Any] | tuple[Any, ...]])4
__future__r   rN   r   rL   collections.abcr   logging.configr   typesr   typingr   r   r	   r
   twisted.pythonr   rP   twisted.python.failurer   rE   scrapy.settingsr   r   scrapy.utils.versionsr   scrapy.crawlerr   scrapy.logformatterr   rW   r8   r,   r   Filterr   rS   r\   r^   __annotations__rX   ri   re   r   r   rV   Handlerr   r   LoggerAdapterr   rh   r   r   <module>r      sD   "   
 * %  5 5 - *  3 .&6 
		8	$K .  % W
 W
 W
 W
* <@!%+.8+.+. 
+.\ 04 , 3
2 .	*	
 *
, 
,""6"$
'// 
r   