+
    ˆx)j[  ã                   ó”  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtHtHt ^ RI	H
t
 ]
! ]4      P                  4       P                  P                  t]! ]! RR7      4      tR R lt ! R R]P"                  4      t ! R	 R
]P&                  4      t ! R R]P&                  4      t ! R R]P,                  4      tR R ltR R ltR# )é    N)ÚdatetimeÚtimezoneÚ	timedelta)ÚPath)Úhoursc                ó$   € V ^8„  d   QhR\         /# )é   Úreturn©Ústr)Úformats   "Ú:/home/tomasb/Code/central_edictos/helpers/logging_setup.pyÚ__annotate__r      s   € ÷ ;ñ ;”ñ ;ó    c                  óV   € \         P                  ! \        4      P                  R R7      # )Úseconds)Útimespec)r   ÚnowÚ_TZÚ	isoformat© r   r   Ú_ahorar      s   € Ü�<Š<œÓ×&Ñ&°	Ð&Ó:Ð:r   c                   ó*   a € ] tR t^t o RtR tRtV tR# )Ú_SanitizeFilteruE   Elimina saltos de lÃ­nea de los mensajes para prevenir log injection.c                óÜ  € \        VP                  4      P                  R R4      P                  RR4      Vn        VP                  '       d    \        ;QJ dK    . R \        VP                  \        4      '       d   VP                  MVP                  3 4       F  NK  	  5MD! R \        VP                  \        4      '       d   VP                  MVP                  3 4       4      Vn        R# )Ú
Ú Úc              3   ó¨   "  € T FH  p\        V\        4      '       d,   \        V4      P                  R R4      P                  RR4      MTx € KJ  	  R# 5i)r   r   r   N)Ú
isinstancer   Úreplace)Ú.0Úas   & r   Ú	<genexpr>Ú)_SanitizeFilter.filter.<locals>.<genexpr>   sG   é € ð  á[�Aô AKÈ1Ìc×@RÒ@R”�A“—‘˜t SÓ)×1Ñ1°$¸Ô<ÐXYÔYÛ[ùs   ‚AAT)r   Úmsgr!   ÚargsÚtupler    )ÚselfÚrecords   &&r   ÚfilterÚ_SanitizeFilter.filter   s£   € Ü˜Ÿ™“_×,Ñ,¨T°3Ó7×?Ñ?ÀÀcÓJˆŒ
Ø�;�;ˆ;ßœ%ñ  ä)3°F·K±KÄ×)GÒ)G˜&Ÿ+š+ÈfÏkÉkÈ^Ð[ó Ÿ%™%ñ  ä)3°F·K±KÄ×)GÒ)G˜&Ÿ+š+ÈfÏkÉkÈ^Ð[ó ó ˆFŒKñ r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r+   Ú__static_attributes__Ú__classdictcell__)Ú__classdict__s   @r   r   r      s   ø‡ € ÙO÷ð r   r   c                   óT   a a€ ] tR t^t oRtV3R lV 3R lltV3R lR ltRtVtV ;t	# )Ú_HybridFormatterzB
2026-05-29T14:23:01-03:00 [INFO ] [proceso] [run:abc123] mensaje
c                ó&   <€ V ^8„  d   QhRS[ RS[ /# ©r	   ÚprocesoÚrun_idr   )r   r4   s   "€r   r   Ú_HybridFormatter.__annotate__"   ó   ø€ ÷ ñ ¡ð ©Sñ r   c                ó<   <€ \         SV `  4        Wn        W n        R # ©N©ÚsuperÚ__init__r9   r:   ©r)   r9   r:   Ú	__class__s   &&&€r   rA   Ú_HybridFormatter.__init__"   ó   ø€ Ü‰ÑÔØŒØŽr   c                ó:   <€ V ^8„  d   QhRS[ P                  RS[/# ©r	   r*   r
   ©ÚloggingÚ	LogRecordr   )r   r4   s   "€r   r   r;   '   s!   ø€ ÷ ñ ™W×.Ñ.ð ±3ñ r   c           	     óT  € VP                   P                  ^4      pVP                  4       p\        4        RV RV P                   RV P
                   RV 2	pVP                  '       d?   VRV P                  VP                  4      P                  4       ^ ,          ,           ,          pV# )é   z [z] [z] [run:z] ú | )	Ú	levelnameÚljustÚ
getMessager   r9   r:   Úexc_infoÚformatExceptionÚ
splitlines)r)   r*   Úlevelr&   Úlines   &&   r   r   Ú_HybridFormatter.format'   sŒ   € Ø× Ñ ×&Ñ& qÓ)ˆØ×ÑÓ!ˆÜ“(�˜2˜e˜W C¨¯© ~°W¸T¿[¹[¸MÈÈCÈ5ÐQˆØ�?�?ˆ?Ø�E˜D×0Ñ0°·±ÓA×LÑLÓNÈqÕQÕQÕQˆDØˆr   ©r9   r:   )
r-   r.   r/   r0   r1   rA   r   r2   r3   Ú__classcell__©rC   r4   s   @@r   r6   r6      s#   ù‡ € ñ÷ó ÷
÷ ð r   r6   c                   óP   a a€ ] tR t^0t oV3R lV 3R lltV3R lR ltRtVtV ;t# )Ú_JsonFormatterc                ó&   <€ V ^8„  d   QhRS[ RS[ /# r8   r   )r   r4   s   "€r   r   Ú_JsonFormatter.__annotate__1   r<   r   c                ó<   <€ \         SV `  4        Wn        W n        R # r>   r?   rB   s   &&&€r   rA   Ú_JsonFormatter.__init__1   rE   r   c                ó:   <€ V ^8„  d   QhRS[ P                  RS[/# rG   rH   )r   r4   s   "€r   r   r]   6   s!   ø€ ÷ 5ñ 5™W×.Ñ.ð 5±3ñ 5r   c                óf  € R \        4       RVP                  RV P                  RV P                  RVP	                  4       R\
        P                  ! 4       /pVP                  '       d4   V P                  VP                  4      P                  4       ^ ,          VR&   \        P                  ! VRR7      # )	ÚtsrT   r9   r:   r&   ÚhostÚ	exceptionF)Úensure_ascii)r   rN   r9   r:   rP   ÚsocketÚgethostnamerQ   rR   rS   ÚjsonÚdumps)r)   r*   Úentrys   && r   r   Ú_JsonFormatter.format6   s�   € à”&“(Ø�V×%Ñ%Ø�t—|‘|Ø�d—k‘kØ�6×$Ñ$Ó&Ø”F×&Ò&Ó(ð
ˆð �?�?ˆ?Ø!%×!5Ñ!5°f·o±oÓ!F×!QÑ!QÓ!SÐTUÕ!VˆE�+ÑÜ�zŠz˜%¨eÔ4Ð4r   rW   )	r-   r.   r/   r0   rA   r   r2   r3   rX   rY   s   @@r   r[   r[   0   s   ù‡ € ÷ó ÷
5÷ 5ð 5r   r[   c                   óH   a a€ ] tR t^Dt oRtV 3R ltV3R lR ltRtVtV ;t	# )Ú
_DBHandleruã   
Handler que inserta cada log en PRS_procesosLogs_eventos via PRS_log_evento.
Se activa llamando a setup_logging_db(id_log) despuÃ©s de PRS_iniciar.
Solo loguea WARNING y ERROR para no saturar la tabla con mensajes DEBUG/INFO.
c                ód   <€ \         SV `  \        P                  R 7       \	        V4      V n        R# ))rT   N)r@   rA   rI   ÚWARNINGÚintÚid_log)r)   rq   rC   s   &&€r   rA   Ú_DBHandler.__init__J   s"   ø€ Ü‰ÑœwŸ™ÐÔ/Ü˜&“kˆŽr   c                ó4   <€ V ^8„  d   QhRS[ P                  /# )r	   r*   )rI   rJ   )r   r4   s   "€r   r   Ú_DBHandler.__annotate__N   s   ø€ ÷ ñ ™7×,Ñ,ñ r   c                óH  €  ^ RI Hp VP                  4       pVP                  '       d?   VRV P	                  VP                  4      P                  4       ^ ,          ,           ,          pV! RV P                  VP                  RVR,          .4       R#   \         d     R# i ; i)r   )Úejecutar_sprM   ÚPRS_log_eventoN:Niô  N)	Ú
helpers.dbrv   rP   rQ   rR   rS   rq   rN   Ú	Exception)r)   r*   rv   r&   s   &&  r   ÚemitÚ_DBHandler.emitN   sŒ   € ð	Ý.Ø×#Ñ#Ó%ˆCØ��ˆØ�u˜t×3Ñ3°F·O±OÓD×OÑOÓQÐRSÕTÕTÕT�ÙÐ(Ø—‘Ø× Ñ ØØ�D•	ð	+ö øô ô 	Úð	ús   ‚'B ªA&B ÂB!Â B!)rq   )
r-   r.   r/   r0   r1   rA   rz   r2   r3   rX   rY   s   @@r   rm   rm   D   s   ù‡ € ñõ
"÷÷ ð r   rm   c                ó   € V ^8„  d   QhRR/# )r	   r
   Nr   )r   s   "r   r   r   ^   s   € ÷ (ñ ( ñ (r   c                óÈ   € V f   R# \         P                  ! 4       pVP                   F  p\        V\        4      '       g   K   R# 	  VP                  \	        V 4      4       R# )u0  
Agrega el handler de DB al logger raÃ­z una vez que se tiene el id_log
devuelto por PRS_iniciar. Llamar despuÃ©s de capturar id_log.

Ejemplo:
    run_id = setup_logging("descarga")
    result = ejecutar_sp('PRS_iniciar', [..., run_id])
    id_log = result[0].get('id_log')
    setup_logging_db(id_log)
N)rI   Ú	getLoggerÚhandlersr    rm   Ú
addHandler)rq   ÚrootÚhs   &  r   Úsetup_logging_dbrƒ   ^   sK   € ð ‚~ÙÜ×ÒÓ€Dà�]Œ]ˆÜ�aœ×$Ô$Úñ ð 	‡O�O”J˜vÓ&Ö'r   c                ó0   € V ^8„  d   QhR\         R\         /# )r	   Únombre_procesor
   r   )r   s   "r   r   r   s   s   € ÷ 'ñ '¤#ð '¬#ñ 'r   c                óü  € \         P                  ! ^4      p\        P                  ! \        4      P                  R4      p\        R,          V ,          p\        R,          R,          pVP                  RRR7       VP                  RRR7       \        W4      p\        W4      p\        P                  ! W2 R2,          RR7      pVP                  V4       VP                  \        P                  4       \        P                  ! WB R	2,          RR7      pVP                  V4       VP                  \        P                  4       \        P                   ! \"        P$                  4      p	V	P                  V4       V	P                  \        P                  4       \        P&                  ! 4       p
V
P(                  P+                  4        V
P                  \        P                  4       V
P-                  \/        4       4       V
P1                  V4       V
P1                  V4       V
P1                  V	4       \        P2                  ! R
V  RV R\4        P6                  ! 4        R\8        P:                  ! 4        24       V# )uÍ   
Configura el logger raÃ­z para el proceso indicado.
Genera un run_id Ãºnico por ejecuciÃ³n.
Escribe en logs/<proceso>/YYYY-MM-DD.log  y  logs/_auditoria/YYYY-MM-DD.audit.jsonl
Retorna el run_id generado.
z%Y-%m-%dÚlogsÚ
_auditoriaT)ÚparentsÚexist_okz.logzutf-8)Úencodingz.audit.jsonlzPROCESO_INICIADO | proceso=z run_id=z pid=z host=)ÚsecretsÚ	token_hexr   r   r   ÚstrftimeÚ_PROJECT_ROOTÚmkdirr6   r[   rI   ÚFileHandlerÚsetFormatterÚsetLevelÚDEBUGÚINFOÚStreamHandlerÚsysÚstdoutr~   r   ÚclearÚ	addFilterr   r€   ÚinfoÚosÚgetpidrf   rg   )r…   r:   ÚhoyÚlogs_dirÚ	audit_dirÚ
hybrid_fmtÚjson_fmtÚfhÚahÚshr�   s   &          r   Úsetup_loggingr¦   s   sÂ  € ô ×Ò˜qÓ!€FÜ
�,Š,”sÓ
×
$Ñ
$ ZÓ
0€Cä˜vÕ%¨Õ6€HÜ Õ&¨Õ5€IØ‡N�N˜4¨$€NÔ/Ø‡O�O˜D¨4€OÔ0ä! .Ó9€JÜ˜nÓ5€Hä	×	Ò	˜X¨%¨t¨Õ4¸wÔ	G€BØ‡O�O�JÔØ‡K�K”—‘Ôä	×	Ò	˜Y¨5°Ð)=Õ=ÈÔ	P€BØ‡O�O�HÔØ‡K�K”—‘Ôä	×	Ò	œsŸz™zÓ	*€BØ‡O�O�JÔØ‡K�K”—‘Ôä×ÒÓ€DØ‡M�M×ÑÔØ‡M�M”'—-‘-Ô Ø‡N�N”?Ó$Ô%Ø‡O�O�BÔØ‡O�O�BÔØ‡O�O�BÔä‡L‚LÐ.¨~Ð.>¸hÀvÀhÈeÔTV×T]ÒT]ÓT_ÐS`Ð`fÔgm×gyÒgyÓg{Ðf|Ð}Ô~Ø€Mr   éýÿÿÿ)rh   rI   rœ   rŒ   rf   r—   r   r   r   Úpathlibr   Ú__file__ÚresolveÚparentr�   r   r   ÚFilterr   Ú	Formatterr6   r[   ÚHandlerrm   rƒ   r¦   r   r   r   Ú<module>r¯      s    ðÛ Û Û 	Û Û Û 
ß 2Ñ 2Ý á�X“×&Ñ&Ó(×/Ñ/×6Ñ6€Ù‰y˜rÔ"Ó#€õ;ô	�g—n‘nô 	ô�w×(Ñ(ô ô$5�W×&Ñ&ô 5ô(�—‘ô õ4(÷*'r   