§
    ¹"Ãj  ã                  ó¸   — U d Z ddlm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
mZ dZdZd	ed
<   dZej        ZdZ G d„ dej        ¦  «        Zdd„Zddd„ZdS )u*  Cáº¥u hÃ¬nh logging táº­p trung cho DSCons ERP.

VÃ¬ sao cáº§n module nÃ y (sá»± cá»‘ 05/10/2026):
    á»¨ng dá»¥ng chÆ°a tá»«ng cáº¥u hÃ¬nh logging. Python khi Ä‘Ã³ chá»‰ in WARNING+ ra stderr qua handler
    dá»± phÃ²ng `logging.lastResort` - khÃ´ng cÃ³ giá»�, má»©c log hay tÃªn module - cÃ²n toÃ n bá»™ INFO
    (captcha Ä‘á»“ng thuáº­n, phiÃªn Ä‘á»“ng bá»™ thÃ nh cÃ´ng, sá»‘ hoÃ¡ Ä‘Æ¡n náº¡p...) bá»‹ nuá»‘t máº¥t.
    Khi há»‡ thá»‘ng cháº¡y tá»‘t, `docker logs dscons-backend` gáº§n nhÆ° chá»‰ cÃ²n log truy cáº­p HTTP.

Thiáº¿t káº¿:
    - Gáº¯n 1 StreamHandler (stdout) vÃ o ROOT logger -> má»�i logger con (`app.*`, `dscons.*`)
      propagate lÃªn Ä‘Ã¢y; pytest `caplog` váº«n hoáº¡t Ä‘á»™ng bÃ¬nh thÆ°á»�ng.
    - Root á»Ÿ má»©c WARNING Ä‘á»ƒ cháº·n INFO á»“n Ã o cá»§a thÆ° viá»‡n ngoÃ i (httpx in má»—i request...);
      riÃªng namespace cá»§a á»©ng dá»¥ng (`app`, `dscons`) má»Ÿ á»Ÿ má»©c DSCONS_LOG_LEVEL (máº·c Ä‘á»‹nh INFO).
    - Logger cá»§a uvicorn cÃ³ handler riÃªng & propagate=False -> khÃ´ng bá»‹ in trÃ¹ng.
    - Idempotent: uvicorn --reload import láº¡i app.main trong tiáº¿n trÃ¬nh má»›i, gá»�i nhiá»�u láº§n
      váº«n chá»‰ cÃ³ Ä‘Ãºng 1 handler (nháº­n diá»‡n qua tÃªn DSCONS_HANDLER_NAME).
    - Giá»� hiá»ƒn thá»‹ theo Viá»‡t Nam (GMT+7) cho dá»… Ä‘á»‘i chiáº¿u vá»›i email cáº£nh bÃ¡o.
é    )ÚannotationsN)Údatetime)ÚTextIO)ÚVN_TZÚVN_TZ_LABELzdscons-console)ÚappÚdsconsztuple[str, ...]ÚAPP_LOGGER_NAMESPACESÚINFOz0%(asctime)s %(levelname)s [%(name)s] %(message)sc                  ó   — e Zd ZdZd
dd	„ZdS )ÚVnTimeFormatteruF   Formatter in thá»�i gian theo giá»� VN: 'YYYY-mm-dd HH:MM:SS (GMT+7)'.NÚrecordúlogging.LogRecordÚdatefmtú
str | NoneÚreturnÚstrc                ó„   — t          j        |j        t          ¬¦  «        }|                     |pd¦  «        › dt
          › �S )N)Útzz%Y-%m-%d %H:%M:%Sú )r   ÚfromtimestampÚcreatedr   Ústrftimer   )Úselfr   r   Úvn_dts       ú-C:\Projects\DSCons\app\core\logging_config.pyÚ
formatTimezVnTimeFormatter.formatTime(   s?   € ÝÔ& v¤~½%Ð@Ñ@Ô@ˆØ—.’. Ð!?Ð,?Ñ@Ô@ÐPÐPÅ;ÐPÐPÐPó    ©N)r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   © r   r   r   r   %   s:   € € € € € ØPÐPðQð Qð Qð Qð Qð Qð Qr   r   r   Úintc                 óî   — t          j        d¦  «        pt                               ¦   «                              ¦   «         } t          j        | ¦  «        }t          |t          ¦  «        r|nt
          j	        S )uc   Ä�á»�c má»©c log tá»« biáº¿n mÃ´i trÆ°á»�ng DSCONS_LOG_LEVEL (DEBUG/INFO/WARNING/...), sai -> INFO.ÚDSCONS_LOG_LEVEL)
ÚosÚgetenvÚDEFAULT_APP_LOG_LEVELÚstripÚupperÚloggingÚgetLevelNameÚ
isinstancer%   r   )ÚrawÚlevels     r   Ú_resolve_app_levelr2   -   s[   € åŒ9Ð'Ñ(Ô(ÐAÕ,A×
HÒ
HÑ
JÔ
J×
PÒ
PÑ
RÔ
R€CÝÔ  Ñ%Ô%€EÝ˜u¥cÑ*Ô*Ð<ˆ5ˆ5µ´Ð<r   ÚstreamúTextIO | Noneúlogging.Handlerc                ó‚  — t          j        ¦   «         }t          d„ |j        D ¦   «         d¦  «        }| pt          j        }|€Dt          j        |¦  «        }|                     t          ¦  «         | 	                    |¦  «         n8t          |t           j        ¦  «        r|j        |ur|                     |¦  «         |                     t          t          ¦  «        ¦  «         |                     t"          ¦  «         t%          ¦   «         }t&          D ])}t          j        |¦  «                             |¦  «         Œ*|S )ua   CÃ i Ä‘áº·t (hoáº·c cáº­p nháº­t) handler console cá»§a DSCons; an toÃ n khi gá»�i nhiá»�u láº§n.c              3  óT   K  — | ]#}|                      ¦   «         t          k    ¯|V — Œ$d S r   )Úget_nameÚDSCONS_HANDLER_NAME)Ú.0Úhs     r   ú	<genexpr>z$configure_logging.<locals>.<genexpr>7   s5   è è € ÐTÐT˜!°·
²
±´Õ@SÒ0SÐ0S�AÐ0SÐ0SÐ0SÐ0SÐTÐTr   N)r-   Ú	getLoggerÚnextÚhandlersÚsysÚstdoutÚStreamHandlerÚset_namer9   Ú
addHandlerr/   r3   Ú	setStreamÚsetFormatterr   Ú
LOG_FORMATÚsetLevelÚTHIRD_PARTY_LOG_LEVELr2   r
   )r3   ÚrootÚhandlerÚtarget_streamÚ	app_levelÚ	namespaces         r   Úconfigure_loggingrO   4   s!  € åÔÑÔ€DÝÐTÐT˜tœ}ÐTÑTÔTÐVZÑ[Ô[€GØÐ(�cœj€Mà€ÝÔ'¨Ñ6Ô6ˆØ×ÒÕ,Ñ-Ô-Ð-Ø�Š˜Ñ Ô Ð Ð Ý	�G�WÔ2Ñ	3Ô	3ð )¸¼ÈmÐ8[Ð8[Ø×Ò˜-Ñ(Ô(Ð(à×Ò�­Ñ4Ô4Ñ5Ô5Ð5Ø‡M‚MÕ'Ñ(Ô(Ð(å"Ñ$Ô$€IÝ*ð 9ð 9ˆ	ÝÔ˜)Ñ$Ô$×-Ò-¨iÑ8Ô8Ð8Ð8Ø€Nr   )r   r%   r   )r3   r4   r   r5   )r#   Ú
__future__r   r-   r(   r@   r   Útypingr   Úapp.core.vn_timer   r   r9   r
   Ú__annotations__r*   ÚWARNINGrI   rG   Ú	Formatterr   r2   rO   r$   r   r   ú<module>rV      s  ððð ð ð& #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à&Ð Ø):Ð Ð :Ð :Ð :Ñ :ØÐ ØœÐ Ø?€
ðQð Qð Qð Qð Q�gÔ'ñ Qô Qð Qð=ð =ð =ð =ðð ð ð ð ð ð r   