Initialize and get a logger by name. If the logger has not been initialized, this method will initialize the logger by adding one or two handlers, otherwise the initialized logger will be directly returned. During initialization, a StreamHandler will always be added. If `log_file` i
(name: str | None = None,
log_file: str | None = None,
log_level: int = logging.INFO,
file_mode: str = 'a',
log_formatter: str = _FORMAT)
| 132 | '%(filename)s:%(lineno)d - %(message)s') |
| 133 | |
| 134 | def get_logger(name: str | None = None, |
| 135 | log_file: str | None = None, |
| 136 | log_level: int = logging.INFO, |
| 137 | file_mode: str = 'a', |
| 138 | log_formatter: str = _FORMAT) -> Logger: |
| 139 | """Initialize and get a logger by name. |
| 140 | |
| 141 | If the logger has not been initialized, this method will initialize the |
| 142 | logger by adding one or two handlers, otherwise the initialized logger will |
| 143 | be directly returned. During initialization, a StreamHandler will always be |
| 144 | added. If `log_file` is specified, a FileHandler will also be added. |
| 145 | Args: |
| 146 | name (str): Logger name. |
| 147 | log_file (str | None): The log filename. If specified, a FileHandler |
| 148 | will be added to the logger. |
| 149 | log_level (int): The logger level. |
| 150 | file_mode (str): The file mode used in opening log file. |
| 151 | Defaults to 'a'. |
| 152 | log_formatter (str): The logger output format. |
| 153 | Returns: |
| 154 | logging.Logger: The expected logger. |
| 155 | """ |
| 156 | logger = logging.getLogger(name) |
| 157 | if name in logger_initialized: |
| 158 | return logger |
| 159 | # handle hierarchical names |
| 160 | # e.g., logger "a" is initialized, then logger "a.b" will skip the |
| 161 | # initialization since it is a child of "a". |
| 162 | for logger_name in logger_initialized: |
| 163 | if name.startswith(logger_name): |
| 164 | return logger |
| 165 | |
| 166 | # handle duplicate logs to the console |
| 167 | for handler in logger.root.handlers: |
| 168 | if type(handler) is logging.StreamHandler: |
| 169 | handler.setLevel(logging.ERROR) |
| 170 | |
| 171 | stream_handler = logging.StreamHandler(stream=sys.stdout) |
| 172 | handlers = [stream_handler] |
| 173 | |
| 174 | # set log_file from env |
| 175 | log_file = log_file or os.getenv('LMDEPLOY_LOG_FILE') |
| 176 | |
| 177 | if log_file is not None: |
| 178 | log_file = os.path.expanduser(log_file) |
| 179 | log_dir = os.path.dirname(log_file) |
| 180 | if log_dir: |
| 181 | os.makedirs(log_dir, exist_ok=True) |
| 182 | # Here, the default behaviour of the official logger is 'a'. Thus, we |
| 183 | # provide an interface to change the file mode to the default |
| 184 | # behaviour. |
| 185 | file_handler = logging.FileHandler(log_file, file_mode) |
| 186 | handlers.append(file_handler) |
| 187 | |
| 188 | formatter = ColorFormatter(log_formatter) |
| 189 | for handler in handlers: |
| 190 | handler.setFormatter(formatter) |
| 191 | handler.setLevel(logging.DEBUG) |
no test coverage detected