"""日志工具.
提供统一的日志配置和管理功能。
"""
import os
import sys
import logging
from datetime import datetime
[文档]
def init_logger(
name: str = "hscredit",
level: int = logging.INFO,
log_file: str = None,
format: str = None,
console: bool = True,
) -> logging.Logger:
"""初始化日志记录器。
:param name: logger 名称,默认为 "hscredit"
:param level: 日志级别,默认为 logging.INFO
:param log_file: 日志文件路径,默认为 None(不写入文件)
:param format: 日志格式,默认为 "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
:param console: 是否输出到控制台,默认为 True
:return: 配置好的 logger 对象
**参考样例**
>>> from hscredit.utils import init_logger
>>> logger = init_logger() # 控制台 INFO 日志
>>> logger = init_logger(level=10) # DEBUG 级别
>>> logger = init_logger(log_file='logs/run.log') # 同时写入文件
>>> logger.info("模型训练开始")
"""
logger = logging.getLogger(name)
# 避免重复添加 handler
if logger.handlers:
return logger
logger.setLevel(level)
# 默认格式
if format is None:
format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
formatter = logging.Formatter(format)
# 控制台输出
if console:
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(level)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# 文件输出
if log_file:
log_dir = os.path.dirname(log_file)
if log_dir and not os.path.exists(log_dir):
os.makedirs(log_dir)
file_handler = logging.FileHandler(log_file, encoding="utf-8")
file_handler.setLevel(level)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
[文档]
def get_logger(name: str = "hscredit") -> logging.Logger:
"""获取已存在的 logger(``logging.getLogger`` 的轻封装)。
:param name: logger 名称,默认 ``"hscredit"``。应与 :func:`init_logger`
创建时使用的名称一致,以复用其 handler 配置
:return: 对应名称的 ``logging.Logger`` 对象
**参考样例**
>>> from hscredit.utils import init_logger, get_logger
>>> init_logger(name='hscredit')
>>> logger = get_logger('hscredit') # 在其他模块复用同一 logger
"""
return logging.getLogger(name)