File size: 1,663 Bytes
663494c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import logging
from mmcv.utils import get_logger as get_real_logger

class LazyLogger:
    """
    A proxy for the real logger. It delays the logger initialization
    until the first time a logging method is called.
    
    This allows defining loggers at the module level in distributed training
    scenarios, where the logger's behavior (especially its rank-specific
    level) depends on a runtime state (dist.is_initialized()) that is
    not available at import time.
    """
    def __init__(self, name, log_file=None, log_level=logging.INFO, file_mode='w'):
        self.name = 'mmdet.' + name
        self.log_file = log_file
        self.log_level = log_level
        self.file_mode = file_mode
        self._logger = None

    def _get_logger(self):
        """Initialize and cache the real logger instance."""
        if self._logger is None:
            # This is the moment of truth: get_real_logger is called here,
            # when dist is already initialized.
            self._logger = get_real_logger(
                name=self.name,
                log_file=self.log_file,
                log_level=self.log_level,
                file_mode=self.file_mode
            )
        return self._logger

    def __getattr__(self, name):
        """
        Forward any attribute access (e.g., .info, .warning)
        to the real logger.
        """
        # The first time you call logger.info, logger.warning, etc.
        # this method will be triggered.
        return getattr(self._get_logger(), name)

def get_logger(name, log_file=None, log_level=logging.INFO, file_mode='w'):
    return LazyLogger(name, log_file, log_level, file_mode)