o
    i                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 eeZddZd	ZdddZdd Zdd Zdedfde jdee dedee dedee j fddZdd ZdS )    N)path)Optional)
get_logger)
get_config)asboolzN%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] {}- %(message)sz~[dd.service=%(dd.service)s dd.env=%(dd.env)s dd.version=%(dd.version)s dd.trace_id=%(dd.trace_id)s dd.span_id=%(dd.span_id)s] i   returnc                  C   s>   t d} tddtr| t   t|  t|  t  dS )ah  Configures ddtrace log levels and file paths.

    Customization is possible with the environment variables:
        ``DD_TRACE_DEBUG``, ``DD_TRACE_LOG_LEVEL``, ``DD_TRACE_LOG_FILE_LEVEL``, and ``DD_TRACE_LOG_FILE``

    By default, when none of the settings have been changed, ddtrace loggers
        inherit from the root logger in the logging module and no logs are written to a file.

    When DD_TRACE_DEBUG has been enabled:
        - Logs are propagated up so that they appear in the application logs if a file path wasn't provided
        - Logs are routed to a file when DD_TRACE_LOG_FILE is specified, using the log level in DD_TRACE_LOG_FILE_LEVEL.
        - Child loggers inherit from the parent ddtrace logger
        - Takes precedence over DD_TRACE_LOG_LEVEL

    When DD_TRACE_LOG_LEVEL is set to NOTSET, DEBUG, INFO, WARNING, ERROR, or CRITICAL:
        - The ddtrace logger level will be set to the specified value based on https://docs.python.org/3/library/logging.html#levels
        - When NOTSET is used, getEffectiveLevel() returns the parent logger's level (inherits from root)
        - Overrides the default root logger behavior
        - DD_TRACE_DEBUG takes precedence

    Note(s):
        1) The ddtrace-run logs under commands/ddtrace_run do not follow DD_TRACE_LOG_FILE if DD_TRACE_DEBUG is enabled.
            This is because ddtrace-run calls ``logging.basicConfig()`` when DD_TRACE_DEBUG is enabled, so
            this configuration is not applied.
        2) Python 2: If the application is using DD_TRACE_DEBUG=true, logging will need to be configured,
            ie: ``logging.basicConfig()``.

    ddtraceDD_TRACE_LOG_STREAM_HANDLERTN)	logging	getLoggerr   r   
addHandlerStreamHandler_configure_ddtrace_debug_logger_configure_ddtrace_file_logger _configure_ddtrace_native_logger)ddtrace_logger r   C/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/_logger.pyconfigure_ddtrace_logger   s   

r   c                 C   sx   t ddt}t d}|r| tj dS |dur:| }ztt|}| | W dS  ty9   t	d| Y dS w dS )a  Configure the ddtrace logger level based on DD_TRACE_DEBUG and DD_TRACE_LOG_LEVEL.

    The priority is DD_TRACE_DEBUG, then DD_TRACE_LOG_LEVEL

    Note: DD_TRACE_DEBUG=true implies a log level of DEBUG, but DD_TRACE_LOG_LEVEL=DEBUG
    does not imply DD_TRACE_DEBUG is enabled.
    DD_TRACE_DEBUGFDD_TRACE_LOG_LEVELNzuDD_TRACE_LOG_LEVEL is invalid (%s). Default log level will be used. Must be NOTSET/DEBUG/INFO/WARNING/ERROR/CRITICAL.)
r   r   setLevelr
   DEBUGuppergetattrAttributeErrorlogwarning)loggertrace_debug	log_levellog_level_upperlog_level_valuer   r   r   r   ;   s"   	

r   c                 C   s^   t dd }ztt|}W n ty   td|w t dtt}t d}t| |||d d S )NDD_TRACE_LOG_FILE_LEVELr   zXDD_TRACE_LOG_FILE_LEVEL is invalid. Log level must be CRITICAL/ERROR/WARNING/INFO/DEBUG.DD_TRACE_LOG_FILE_SIZE_BYTESDD_TRACE_LOG_FILE)r   log_pathr    max_file_bytes)	r   r   r   r
   r   
ValueErrorDEFAULT_FILE_SIZE_BYTESint_add_file_handler)r   log_file_levelfile_log_level_valuer'   r&   r   r   r   r   X   s   r   r   r&   r    handler_namer'   	formatterc                 C   s   d }|d urEt |}d}ddlm} ||d||d}|d u r'd}	t|	}
n|}
|| ||
 |r:|| | 	| | 
d| |S )N   r   )RotatingFileHandlera)filenamemodemaxBytesbackupCountzL%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] - %(message)sz!ddtrace logs will be routed to %s)r   abspathlogging.handlersr1   r
   	Formatterr   setFormatterset_namer   debug)r   r&   r    r.   r'   r/   ddtrace_file_handler
num_backupr1   
log_formatlog_formatterr   r   r   r+   f   s&   




r+   c                  C   s   zUddl m}  ddlm} |jrStd}|sW d S d|i}|dkr>tddd	d
|d< tddtd	d
|d< tddtd	d
|d< | jdi | | tddd	d
 W d S W d S  t	yf   t
jdd	d Y d S w )Nr   )r   )config_DD_NATIVE_LOGGING_BACKENDoutputfile_DD_NATIVE_LOGGING_FILE_PATHz
native.logT)report_telemetryr   "_DD_NATIVE_LOGGING_FILE_SIZE_BYTESi   max_size_bytes$_DD_NATIVE_LOGGING_FILE_ROTATION_LENr0   	max_files_DD_NATIVE_LOGGING_LOG_LEVELr   z"Failed to initialize native logger)exc_infor   )ddtrace.internal.native._nativer   !ddtrace.internal.settings._configrA   _trace_writer_nativer   r*   	configureset_log_level	Exceptionr   r   )r   rA   backendkwargsr   r   r   r      s(   
r   )r   N)r
   osr   typingr   ddtrace.internal.loggerr   ddtrace.internal.telemetryr   ddtrace.internal.utils.formatsr   __name__r   formatDD_LOG_FORMATr)   r   r   r   Loggerstrr*   r9   r+   r   r   r   r   r   <module>   s>    
'
