
    LCj-                         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++,  ##CJJ/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gnn 98#S #W^^ #r   