InternLM/internlm/utils/logger.py

99 lines
3.0 KiB
Python

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import logging
import os
LOGGER_NAME = "internlm"
LOGGER_FORMAT = "%(asctime)s\t%(levelname)s %(filename)s:%(lineno)s in %(funcName)s -- %(message)s"
LOGGER_LEVEL = "info"
LOGGER_LEVEL_CHOICES = ["debug", "info", "warning", "error", "critical"]
LOGGER_LEVEL_HELP = (
"The logging level threshold, choices=['debug', 'info', 'warning', 'error', 'critical'], default='info'"
)
uniscale_logger = None
def get_logger(logger_name: str = LOGGER_NAME, logging_level: str = LOGGER_LEVEL) -> logging.Logger:
"""Configure the logger that is used for uniscale framework.
Args:
logger_name (str): used to create or get the correspoding logger in
getLogger call. It will be "internlm" by default.
logging_level (str, optional): Logging level in string or logging enum.
Returns:
logger (logging.Logger): the created or modified logger.
"""
if uniscale_logger is not None:
return uniscale_logger
logger = logging.getLogger(logger_name)
if logging_level not in LOGGER_LEVEL_CHOICES:
logging_level = LOGGER_LEVEL
print(LOGGER_LEVEL_HELP)
logging_level = logging.getLevelName(logging_level.upper())
handler = logging.StreamHandler()
handler.setLevel(logging_level)
logger.setLevel(logging_level)
handler.setFormatter(logging.Formatter(LOGGER_FORMAT))
logger.addHandler(handler)
return logger
def initialize_uniscale_logger(
job_name: str = None,
launch_time: str = None,
file_name: str = None,
name: str = LOGGER_NAME,
level: str = LOGGER_LEVEL,
file_path: str = None,
is_std: bool = True,
):
"""
Initialize uniscale logger.
Args:
job_name (str): The name of training job, defaults to None.
launch_time (str): The launch time of training job, defaults to None.
file_name (str): The log file name, defaults to None.
name (str): The logger name, defaults to "internlm".
level (str): The log level, defaults to "info".
file_path (str): The log file path, defaults to None.
is_std (bool): Whether to output to console, defaults to True.
Returns:
Uniscale logger instance.
"""
try:
from uniscale_monitoring import get_logger as get_uniscale_logger
except ImportError:
print("Failed to import module uniscale_monitoring. Use default python logger.")
return None
if not file_path:
assert (
job_name and launch_time and file_name
), "If file_path is None, job_name, launch_time and file_name must be setted."
log_file_name = file_name
log_folder = os.path.join(job_name, launch_time, "logs")
log_dir = os.path.join(log_folder, log_file_name)
file_path = log_dir
logger = get_uniscale_logger(name=name, level=level, filename=file_path, is_std=is_std)
if isinstance(logger, (list, tuple)):
logger = list(logger)[0]
global uniscale_logger
uniscale_logger = logger
return logger