# -*- coding: utf-8 -*-
# @Time : 2020/8/7
# @Author : Zihan Lin
# @Email : linzihan.super@foxmail.com
# UPDATE
# @Time : 2021/3/7
# @Author : Jiawei Guan
# @Email : guanjw@ruc.edu.cn
# UPDATE:
# @Time : 2022/07/10
# @Author : Junjie Zhang
# @Email : zjj001128@163.com
"""
recbole.utils.logger
###############################
"""
import logging
import os
import colorlog
import re
import hashlib
from recbole.utils.utils import get_local_time, ensure_dir
from colorama import init
log_colors_config = {
"DEBUG": "cyan",
"WARNING": "yellow",
"ERROR": "red",
"CRITICAL": "red",
}
[docs]class RemoveColorFilter(logging.Filter):
[docs] def filter(self, record):
if record:
ansi_escape = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
record.msg = ansi_escape.sub("", str(record.msg))
return True
[docs]def set_color(log, color, highlight=True):
color_set = ["black", "red", "green", "yellow", "blue", "pink", "cyan", "white"]
try:
index = color_set.index(color)
except:
index = len(color_set) - 1
prev_log = "\033["
if highlight:
prev_log += "1;3"
else:
prev_log += "0;3"
prev_log += str(index) + "m"
return prev_log + log + "\033[0m"
[docs]def init_logger(config):
"""
A logger that can show a message on standard output and write it into the
file named `filename` simultaneously.
All the message that you want to log MUST be str.
Args:
config (Config): An instance object of Config, used to record parameter information.
Example:
>>> logger = logging.getLogger(config)
>>> logger.debug(train_state)
>>> logger.info(train_result)
"""
init(autoreset=True)
LOGROOT = "./log/"
dir_name = os.path.dirname(LOGROOT)
ensure_dir(dir_name)
model_name = os.path.join(dir_name, config["model"])
ensure_dir(model_name)
config_str = "".join([str(key) for key in config.final_config_dict.values()])
md5 = hashlib.md5(config_str.encode(encoding="utf-8")).hexdigest()[:6]
logfilename = "{}/{}-{}-{}-{}.log".format(
config["model"], config["model"], config["dataset"], get_local_time(), md5
)
logfilepath = os.path.join(LOGROOT, logfilename)
filefmt = "%(asctime)-15s %(levelname)s %(message)s"
filedatefmt = "%a %d %b %Y %H:%M:%S"
fileformatter = logging.Formatter(filefmt, filedatefmt)
sfmt = "%(log_color)s%(asctime)-15s %(levelname)s %(message)s"
sdatefmt = "%d %b %H:%M"
sformatter = colorlog.ColoredFormatter(sfmt, sdatefmt, log_colors=log_colors_config)
if config["state"] is None or config["state"].lower() == "info":
level = logging.INFO
elif config["state"].lower() == "debug":
level = logging.DEBUG
elif config["state"].lower() == "error":
level = logging.ERROR
elif config["state"].lower() == "warning":
level = logging.WARNING
elif config["state"].lower() == "critical":
level = logging.CRITICAL
else:
level = logging.INFO
fh = logging.FileHandler(logfilepath)
fh.setLevel(level)
fh.setFormatter(fileformatter)
remove_color_filter = RemoveColorFilter()
fh.addFilter(remove_color_filter)
sh = logging.StreamHandler()
sh.setLevel(level)
sh.setFormatter(sformatter)
logging.basicConfig(level=level, handlers=[sh, fh])