
    i                        d 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	m
Z
 ddlmZ  G d dej                        Z G d	 d
ej                        Z	 	 	 	 	 d dededede
e   dedej$                  fdZdedej$                  fdZdej$                  dedefdZ	 d!dej$                  dedeee	f   de
e   fdZ edddd      Zy)"z
Logging configuration for the RAG system.

This module provides structured logging capabilities with different log levels,
JSON formatting for production, and configurable outputs.
    N)datetime)Path)DictAnyOptional)BASE_DIRc                   4    e Zd ZdZdej
                  defdZy)JSONFormatterz&JSON formatter for structured logging.recordreturnc                    t        j                  |j                        j                         |j                  |j
                  |j                         |j                  |j                  |j                  d}|j                  r| j                  |j                        |d<   t        |d      r|j                  |j                         t        j                   |d      S )N)	timestamplevelloggermessagemodulefunctionline	exceptionextra_fieldsF)ensure_ascii)r   fromtimestampcreated	isoformat	levelnamename
getMessager   funcNamelinenoexc_infoformatExceptionhasattrupdater   jsondumps)selfr   	log_entrys      2/var/www/html/leadgen/airagagent/logging_config.pyformatzJSONFormatter.format   s    !//?IIK%%kk((*mmMM
	 ??%)%9%9&//%JIk" 6>*V001zz)%88    N__name__
__module____qualname____doc__logging	LogRecordstrr)    r*   r(   r
   r
      s    09W.. 93 9r*   r
   c                   4    e Zd ZdZdej
                  defdZy)ConsoleFormatterz!Human-readable console formatter.r   r   c                 6   t        j                  |j                        j                  d      }d|j                   d}d|j
                   d}|j                         }| d| d| d| }|j                  r!|d| j                  |j                         z  }|S )Nz%Y-%m-%d %H:%M:%S[] 
)	r   r   r   strftimer   r   r   r    r!   )r&   r   r   r   r   r   	formatteds          r(   r)   zConsoleFormatter.format-   s    **6>>:CCDWX	F$$%Q'V]]O1%##% k5'6(!G9=	 ??2d226??CDEEIr*   Nr+   r3   r*   r(   r5   r5   *   s    +W.. 3 r*   r5   INFOTFr   log_to_filelog_to_consolelog_dirjson_formatr   c                 "   |	t         dz  }|j                  dd       t        t        | j	                         t        j
                        }t        j                         }|j                  |       |j                  dd D ]  }|j                  |        t               }t               }	|rVt        j                  t        j                        }
|
j                  |       |
j                  |       |j!                  |
       |r
|dt#        j$                         j'                  d       dz  }t        j(                  |d	      }|j                  |       |r|j                  |	       n|j                  |       |j!                  |       |d
t#        j$                         j'                  d       dz  }t        j(                  |d	      }|j                  t        j*                         |j                  |       |j!                  |       |S )a  
    Set up logging configuration for the RAG system.

    Args:
        level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
        log_to_file: Whether to log to file
        log_to_console: Whether to log to console
        log_dir: Directory for log files (defaults to BASE_DIR/logs)
        json_format: Whether to use JSON formatting for file logs

    Returns:
        Root logger configured with the specified settings
    NlogsT)parentsexist_okrag_system_z%Y%m%dz.logzutf-8)encodingrag_system_errors_)r   mkdirgetattrr0   upperr=   	getLoggersetLevelhandlersremoveHandlerr5   r
   StreamHandlersysstdoutsetFormatter
addHandlerr   nowr;   FileHandlerWARNING)r   r>   r?   r@   rA   numeric_levelr   handlerconsole_formatterjson_formatterconsole_handlerlog_filefile_handlererror_log_fileerror_handlers                  r(   setup_loggingra   <   s   ( V# MM$M. GU[[]GLLAM  F
OOM" ??1% &W%& )*"_N !//

;  /$$%67/* {8<<>+B+B8+L*MTRR**8gFm,%%n5%%&78,' !%78O8OPX8Y7ZZ^#__++NWMw/""#45-(Mr*   r   c                 ,    t        j                  |       S )z
    Get a logger instance for a specific module.

    Args:
        name: Logger name (usually __name__)

    Returns:
        Configured logger instance
    )r0   rL   )r   s    r(   
get_loggerrc      s     T""r*   r   	operationdurationc                 H    | j                  d| d|ddd||d|i       y)	zLog performance metrics.zPerformance: z completed in z.3fsr   )rd   re   )extraN)info)r   rd   re   r   s       r(   log_performancerj      s:    
KK
	{.#a@YH]P\]^  r*   errorcontextr   c           	          |d|j                   j                   }| j                  ||d|j                   j                  t        |      d|i       y)z1Log an error with additional context information.NzError occurred: r   )
error_typeerror_message)r    rh   )	__class__r,   rk   r2   )r   rk   rl   r   s       r(   log_error_with_contextrq      sb     $U__%=%=$>?
LL#oo66!$U 
  
r*   )r   r>   r?   rA   )r=   TTNF)N)r/   r0   r$   rQ   r   pathlibr   typingr   r   r   configr   	Formatterr
   r5   r2   boolLoggerra   rc   floatrj   	Exceptionrq   default_loggerr3   r*   r(   <module>r{      s1     
   & & 9G%% 92w(( & "EEE E d^	E
 E ^^EP
#S 
#W^^ 
#GNN s e  "	NN #s(^ c]	0 
	r*   