Files
ai_tagging_images/logger.py

119 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
"""
日志管理模块
统一管理日志配置和输出
"""
import os
import logging
import sys
from datetime import datetime
from typing import Optional
# 日志目录
LOG_DIR = os.path.join(os.path.dirname(__file__), "logs")
def setup_logger(
name: str = "tag_derive",
level: str = "INFO",
log_file: Optional[str] = None,
console: bool = True
) -> logging.Logger:
"""
设置并返回logger
Args:
name: logger名称
level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
log_file: 日志文件路径None则不写入文件
console: 是否输出到控制台
"""
logger = logging.getLogger(name)
# 避免重复添加handler
if logger.handlers:
return logger
logger.setLevel(getattr(logging, level.upper(), logging.INFO))
# 日志格式
formatter = logging.Formatter(
fmt="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
# 控制台输出
if console:
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# 文件输出
if log_file:
# 确保日志目录存在
os.makedirs(os.path.dirname(log_file), exist_ok=True)
file_handler = logging.FileHandler(log_file, encoding="utf-8")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
def get_default_log_file() -> str:
"""获取默认日志文件路径(按日期)"""
os.makedirs(LOG_DIR, exist_ok=True)
date_str = datetime.now().strftime("%Y%m%d")
return os.path.join(LOG_DIR, f"tag_derive_{date_str}.log")
# 默认logger实例
_default_logger = None
def get_logger(name: str = "tag_derive") -> logging.Logger:
"""获取logger实例"""
global _default_logger
if _default_logger is None:
_default_logger = setup_logger(
name=name,
level="INFO",
log_file=get_default_log_file(),
console=True
)
return _default_logger
class LogMixin:
"""日志混入类,为类提供日志能力"""
@property
def logger(self) -> logging.Logger:
if not hasattr(self, '_logger'):
self._logger = get_logger(self.__class__.__name__)
return self._logger
# ============== 便捷函数 ==============
def log_info(msg: str, *args):
get_logger().info(msg, *args)
def log_error(msg: str, *args):
get_logger().error(msg, *args)
def log_warning(msg: str, *args):
get_logger().warning(msg, *args)
def log_debug(msg: str, *args):
get_logger().debug(msg, *args)
if __name__ == "__main__":
# 测试日志
logger = get_logger()
logger.info("日志系统初始化成功")
logger.debug("这是DEBUG日志")
logger.warning("这是WARNING日志")
logger.error("这是ERROR日志")
print(f"日志文件: {get_default_log_file()}")