Ë
    LµCj-  ã                   óÆ   — U d Z ddlZddlZddlmZ ddlmZ ddlmZ  e«       Z	 edd¬«      Z
ee   ed	<    G d
„ dej                  «      Zdd„Zdedej                   fd„Zy)uý  
Structured logging configuration.

Why JSON logs: on a production VPS, you (or a log aggregator like Loki/
Grafana) need to filter and search logs reliably. Plain text logs are fine
for local dev (human-readable), but production needs machine-parseable
fields: timestamp, level, request_id, latency_ms, etc.

Every request gets a request_id that flows through all log lines for that
request â€” this is what lets you trace a single farmer's query through
validation -> models -> LLM -> response in the logs.
é    N)Ú
ContextVar)Ú
jsonlogger)Úget_settingsÚ
request_idú-)ÚdefaultÚrequest_id_ctxc                   ó0   — e Zd Zdej                  defd„Zy)ÚRequestIdFilterÚrecordÚreturnc                 ó6   — t         j                  «       |_        y)NT)r	   Úgetr   )Úselfr   s     úDC:\Crop_Prediction\Backend\crop-ai-system\app\core\logging_config.pyÚfilterzRequestIdFilter.filter   s   € Ü*×.Ñ.Ó0ˆÔØó    N)Ú__name__Ú
__module__Ú__qualname__ÚloggingÚ	LogRecordÚboolr   © r   r   r   r      s   „ ð˜W×.Ñ.ð °4ô r   r   r   c                  ó¢  — t        j                  «       } | j                  t        j                  «       | j
                  j                  «        t        j                  t        j                  «      }|j                  t        «       «       t        j                  rt        j                  ddddœ¬«      }nt        j                  d«      }|j!                  |«       | j#                  |«       t        j                  d«      j                  t         j$                  «       t        j                  d«      j                  t         j$                  «       y )	Nz=%(asctime)s %(levelname)s %(name)s %(request_id)s %(message)sÚ	timestampÚlevel)ÚasctimeÚ	levelname)Úrename_fieldszG%(asctime)s | %(levelname)-8s | %(request_id)s | %(name)s | %(message)szuvicorn.accessÚhttpx)r   Ú	getLoggerÚsetLevelÚsettingsÚ	LOG_LEVELÚhandlersÚclearÚStreamHandlerÚsysÚstdoutÚ	addFilterr   ÚLOG_JSONr   ÚJsonFormatterÚ	FormatterÚsetFormatterÚ
addHandlerÚWARNING)Úroot_loggerÚhandlerÚ	formatters      r   Úsetup_loggingr5   #   sñ   € Ü×#Ñ#Ó%€KØ×Ñœ×+Ñ+Ô,ð ×Ñ×ÑÔ ä×#Ñ#¤C§J¡JÓ/€GØ×Ñ”oÓ'Ô(ä×ÒÜ×,Ñ,ØKØ&1ÀÑHô
‰	ô
 ×%Ñ%ØUó
ˆ	ð ×Ñ˜Ô#Ø×Ñ˜7Ô#ô ×ÑÐ&Ó'×0Ñ0´·±ÔAÜ×Ñ�gÓ×'Ñ'¬¯©Õ8r   Únamec                 ó,   — t        j                  | «      S )N)r   r"   )r6   s    r   Ú
get_loggerr8   ?   s   € Ü×Ñ˜TÓ"Ð"r   )r   N)Ú__doc__r   r)   Úcontextvarsr   Úpythonjsonloggerr   Úapp.core.configr   r$   r	   ÚstrÚ__annotations__ÚFilterr   r5   ÚLoggerr8   r   r   r   ú<module>rA      se   ðòó Û 
Ý "Ý 'å (á‹>€ñ
 #-¨\À3Ô"G€�
˜3‘Ó Gô�g—n‘nô ó9ð8#�Sð #˜WŸ^™^ô #r   