o
    h;                     @   s   d Z ddlZddlZddl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 ddlZddlZddlZddlmZmZmZmZ G dd dZG d	d
 d
ZddefddZdefddZddeeef defddZe ZdS )z
Comprehensive logging system for the MAB Recommender System.
Provides structured logging with different levels, file rotation, and performance tracking.
    N)datetime)Pathwraps)OptionalDictAnyCallablec                   @   sd   e Zd ZdZdd ZdefddZdedefdd	Zde	ee
f fd
dZde	ee
f fddZdS )PerformanceLoggerz0Tracks performance metrics and system resources.c                 C   s   i | _ i | _t | _d S N)metricsstart_times	threadingLock_lockself r   b/Users/divyeshpatel/Desktop/sahana/Recommender/recommender_rl/recommender/rl_recommender/logger.py__init__   s   zPerformanceLogger.__init__operation_namec                 C   s:   | j  t | j|< W d   dS 1 sw   Y  dS )zStart timing an operation.N)r   timer   )r   r   r   r   r   start_timer   s   "zPerformanceLogger.start_timerreturnc                 C   s   | j 7 || jv r1t | j|  }|| jvrg | j|< | j| | | j|= |W  d   S 	 W d   dS 1 s=w   Y  dS )z,End timing an operation and return duration.Ng        )r   r   r   r   append)r   r   durationr   r   r   	end_timer"   s   


$zPerformanceLogger.end_timerc                 C   s^   z#t  }| | | jd d | t| t|	 dW S  t
y.   i  Y S w )z"Get current system resource usage.i   )cpu_percentmemory_percentZ
memory_rssthreads
open_filesconnections)psutilProcessr   r   Zmemory_infoZrssnum_threadslenr    r!   	Exception)r   processr   r   r   get_system_stats.   s   

z"PerformanceLogger.get_system_statsc                 C   sP   i }| j  D ]\}}|r%t|t|t|t| t|t|d||< q|S )z'Get summary of all performance metrics.)count
total_timeZavg_timeZmin_timeZmax_time)r   itemsr%   summinmax)r   summaryZ	operationtimesr   r   r   get_performance_summary=   s   
z)PerformanceLogger.get_performance_summaryN)__name__
__module____qualname____doc__r   strr   floatr   r   r   r(   r1   r   r   r   r   r
      s    r
   c                   @   s  e Zd ZdZ								dMd	ed
ededededededefddZdej	fddZ
dedefddZdefddZdefddZdefddZdefd d!Zdefd"d#Zdefd$d%Zd&efd'd(Zd&efd)d*Z	+dNd,ed-ed.ee fd/d0Zd,ed1ed2ed3ed4ef
d5d6Zd7efd8d9Zd:ed;ed<efd=d>Zd?ed@efdAdBZdCedDedEefdFdGZdeeef fdHdIZdNdJedefdKdLZ d+S )ORecommenderLoggerz
    Main logging class for the recommender system.
    Provides structured logging with different levels and file rotation.
    recommender_system	/tmp/logsINFO      TFnamelog_dir	log_levelmax_file_sizebackup_countenable_consoleenable_fileenable_performancec	           	      C   s   || _ t|| _tt| | _|| _|| _|| _	|| _
|| _| j
r*| jjddd | jr2t | _nd| _|  | _| jd| t| jt| j|||dd dS )a  
        Initialize the logger.
        
        Args:
            name: Logger name
            log_dir: Directory to store log files
            log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
            max_file_size: Maximum size of log file before rotation
            backup_count: Number of backup files to keep
            enable_console: Enable console logging
            enable_file: Enable file logging
            enable_performance: Enable performance tracking
        T)parentsexist_okNzLogger initialized: )r?   r@   rC   rD   rE   extra)r>   r   r?   getattrloggingupperr@   rA   rB   rC   rD   rE   mkdirr
   performance_logger_setup_loggerloggerinfor6   getLevelName)	r   r>   r?   r@   rA   rB   rC   rD   rE   r   r   r   r   Q   s*   



zRecommenderLogger.__init__r   c                 C   sD  t | j}|| j |j  t d}t d}| jr4t 	t
j}|| j || || | jrt jj| j| j d | j| jd}|| j || || t jj| j| j d | j| jd}|t j || || | jrt jj| j| j d | j| jd}|t j || || |S )z.Setup the logger with handlers and formatters.zN%(asctime)s | %(name)s | %(levelname)s | %(funcName)s:%(lineno)d | %(message)sz)%(asctime)s | %(levelname)s | %(message)sz.log)maxBytesbackupCountz_errors.logz_performance.log)rK   	getLoggerr>   setLevelr@   handlersclear	FormatterrC   StreamHandlersysstdoutsetFormatter
addHandlerrD   RotatingFileHandlerr?   rA   rB   ERRORrE   r;   )r   rP   Zdetailed_formatterZsimple_formatterZconsole_handlerZmain_handlererror_handlerZperf_handlerr   r   r   rO      sR   








zRecommenderLogger._setup_loggerlevelmessagec                 K   s>   i }|r|}| j r| j  }|r||d< | jj|||d dS )z$Log message with additional context.system_statsrH   N)rN   r(   rP   log)r   rb   rc   kwargsrI   rd   r   r   r   _log_with_context   s   
z#RecommenderLogger._log_with_contextc                 K      | j tj|fi | dS )zLog debug message.N)rg   rK   DEBUGr   rc   rf   r   r   r   debug      zRecommenderLogger.debugc                 K   rh   )zLog info message.N)rg   rK   r;   rj   r   r   r   rQ      rl   zRecommenderLogger.infoc                 K   rh   )zLog warning message.N)rg   rK   WARNINGrj   r   r   r   warning   rl   zRecommenderLogger.warningc                 K   rh   )zLog error message.N)rg   rK   r`   rj   r   r   r   error   rl   zRecommenderLogger.errorc                 K   rh   )zLog critical message.N)rg   rK   CRITICALrj   r   r   r   critical   rl   zRecommenderLogger.criticalc                 K   s.   |  }t |d< | jtj|fi | dS )zLog exception with traceback.	tracebackN)copyrr   
format_excrg   rK   r`   )r   rc   rf   rI   r   r   r   	exception   s   zRecommenderLogger.exceptionr   c                 K   s2   | j r| j | | jd| fi | dS dS )z$Log performance-related information.zPerformance: Started N)rN   r   rQ   )r   r   rf   r   r   r   performance   s   zRecommenderLogger.performancec                 K   s@   | j r| j |}| jd| d|ddfd|i| dS dS )z*End performance tracking and log duration.zPerformance: Completed z in .4fsr   N)rN   r   rQ   )r   r   rf   r   r   r   r   performance_end   s   
z!RecommenderLogger.performance_endNalgorithm_namearms_selectedcontextc                 K   s8   |||d}| | | jd| d| fi | dS )zLog algorithm arm selection.)	algorithmr{   r|   z
Algorithm z selected arms: NupdaterQ   )r   rz   r{   r|   rf   rI   r   r   r   log_algorithm_selection   s   
"z)RecommenderLogger.log_algorithm_selectionarmsrewardscumulative_rewardstepc                 K   sD   |||||d}| | | jd| d| d|dfi | dS )zLog reward information.)r}   r   r   r   r   zReward received: z
 for arms z, cumulative: rw   Nr~   )r   rz   r   r   r   r   rf   rI   r   r   r   
log_reward  s   
*zRecommenderLogger.log_rewarduser_idc                 K   s.   d|i}| | | jd| fi | dS )zLog environment reset.r   zEnvironment reset for user: Nr~   )r   r   rf   rI   r   r   r   log_environment_reset  s   
z'RecommenderLogger.log_environment_reset
algorithmsn_usersn_stepsc                 K   sD   |||d}| | | jdt| d| d| dfi | dS )zLog simulation start.)r   r   r   zStarting simulation with z algorithms, z users, z stepsN)r   rQ   r%   )r   r   r   r   rf   rI   r   r   r   log_simulation_start  s   
.z&RecommenderLogger.log_simulation_startresultsr   c                 K   sB   dd |  D |d}|| | jd|ddfi | dS )zLog simulation completion.c                 S   s0   i | ]\}}|t |trt|ntt|qS r   )
isinstancelistr%   r6   type).0kvr   r   r   
<dictcomp>!  s   0 z=RecommenderLogger.log_simulation_complete.<locals>.<dictcomp>)Zresults_summaryr   zSimulation completed in rw   rx   N)r+   r   rQ   )r   r   r   rf   rI   r   r   r   log_simulation_complete  s
   
 z)RecommenderLogger.log_simulation_completeconfig_name	old_value	new_valuec                 K   s@   |||d}| | | jd| d| d| dfi | dS )zLog configuration changes.)r   r   r   zConfiguration changed: z = z (was: )Nr~   )r   r   r   r   rf   rI   r   r   r   log_config_change'  s   
*z#RecommenderLogger.log_config_changec                 C   s   | j r| j  S i S )zGet performance summary.)rN   r1   r   r   r   r   r1   1  s   
z)RecommenderLogger.get_performance_summaryoutput_filec              	   C   s   |du rt  d}| jd| d }t   | j|  g d}| j| j dD ]}|d |j|	 j
t |	 j d q,t|d	}tj||d
d W d   n1 s^w   Y  | d|  t|S )zExport logs to a file.Nz%Y%m%d_%H%M%SZlogs_export_z.json)Zexport_timestamplogger_nameZperformance_summary	log_filesz*.log*r   )filenameZ
size_bytesmodifiedw   )indentzLogs exported to: )r   nowstrftimer?   	isoformatr>   r1   globr   statst_sizefromtimestampst_mtimeopenjsondumprQ   r6   )r   r   	timestampZexport_dataZlog_filefr   r   r   export_logs7  s&   

zRecommenderLogger.export_logs)r9   r:   r;   r<   r=   TFTr   )!r2   r3   r4   r5   r6   intboolr   rK   LoggerrO   rg   rk   rQ   rn   ro   rq   ru   rv   ry   r   r   r   r   r7   r   r   r   r   r   r   r1   r   r   r   r   r   r8   K   sh    
5;


	
r8   r   c                    s   dt f fdd}|S )z
    Decorator to automatically track performance of functions.
    
    Usage:
        @performance_tracker("my_operation")
        def my_function():
            pass
    funcc                    s   t   fdd}|S )Nc               
      s   d }| D ]}t |dr|j} nq|d u r'| r$t | d dr$| d j}nt }p+ j}|| z | i |}|| |W S  tyZ } z|d| dt|   d }~ww )NrP   r   z	Error in z: )	hasattrrP   get_default_loggerr2   rv   ry   r&   ru   r6   )argsrf   rP   argop_nameresulte)r   r   r   r   wrapper\  s*   



z7performance_tracker.<locals>.decorator.<locals>.wrapperr   )r   r   r   )r   r   	decorator[  s   z&performance_tracker.<locals>.decorator)r	   )r   r   r   r   r   performance_trackerR  s   	r   r   c                   C   s   t tds	t t_tjS )z Get the default logger instance.	_instance)r   r   r8   r   r   r   r   r   r   {  s   
r   configc              	   C   s:   | du ri } ddddddddd	}| |  td
i |S )z!Setup logging with configuration.Nr9   r:   r;   r<   r=   TF)r>   r?   r@   rA   rB   rC   rD   rE   r   )r   r8   )r   Zdefault_configr   r   r   setup_logging  s   
r   r   )r5   rK   logging.handlersosr[   r   r   r   pathlibr   	functoolsr   rr   r"   r   typingr   r   r   r	   r
   r8   r6   r   r   r   Zdefault_loggerr   r   r   r   <module>   s,   6  	)
