File size: 3,058 Bytes
27e74f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import logging
import os
from logging.handlers import TimedRotatingFileHandler
from colorlog import ColoredFormatter


def setup_logging():
    """配置日志系统"""
    # 创建logs目录(如果不存在)
    log_dir = os.path.join(
        os.path.dirname(os.path.abspath(__file__)), 
        '..', 
        '..', 
        'logs'
    )
    os.makedirs(log_dir, exist_ok=True)
    
    # 日志文件路径
    log_file = os.path.join(log_dir, 'app.log')
    
    # 创建根日志记录器
    root_logger = logging.getLogger()
    root_logger.setLevel(logging.INFO)  # 设置根日志级别
    
    # 清除已有的处理器(避免重复添加)
    if root_logger.handlers:
        root_logger.handlers.clear()
    
    # 创建控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    
    # 创建按天切割的文件处理器
    file_handler = TimedRotatingFileHandler(
        log_file,
        when='midnight',  # 每天午夜切割
        interval=1,       # 每1天
        backupCount=30,   # 保留30天的日志
        encoding='utf-8'
    )
    file_handler.setLevel(logging.INFO)
    file_handler.suffix = "%Y-%m-%d.log"  # 日志文件后缀格式
    
    # 创建格式化器
    formatter = logging.Formatter(
        '%(asctime)s[%(name)s] - %(levelname)s - %(message)s - %(threadName)s'
    )
    
    # 控制台颜色格式化器
    color_formatter = ColoredFormatter(
        '%(green)s%(asctime)s%(reset)s[%(blue)s%(name)s%(reset)s] - '
        '%(log_color)s%(levelname)s%(reset)s - %(green)s%(message)s%(reset)s - '
        '%(cyan)s%(threadName)s%(reset)s',
        log_colors={
            'DEBUG': 'cyan',
            'INFO': 'white',
            'WARNING': 'yellow',
            'ERROR': 'red',
            'CRITICAL': 'red,bg_white',
        },
        secondary_log_colors={
            'asctime': {'green': 'green'},
            'name': {'blue': 'blue'}
        }
    )
    console_handler.setFormatter(color_formatter)
    file_handler.setFormatter(formatter)
    
    # 添加处理器到根日志记录器
    root_logger.addHandler(console_handler)
    root_logger.addHandler(file_handler)

    # 输出日志配置信息
    logging.info("日志系统已初始化,日志文件: %s", log_file)
    
    return log_file


def get_logger(name):
    """
    获取统一配置的日志记录器
    
    Args:
        name: 日志记录器名称,通常是模块名
        
    Returns:
        logging.Logger: 配置好的日志记录器
    
    示例:
        logger = get_logger(__name__)
        logger.info("这是一条信息")
        logger.error("出错了: %s", error_msg)
    """
    logger = logging.getLogger(name)
    
    # 添加一些辅助方法
    def log_error_with_exc(msg, *args, **kwargs):
        """记录错误并自动包含异常堆栈"""
        kwargs['exc_info'] = True
        logger.error(msg, *args, **kwargs)
    
    # 添加到日志记录器
    logger.error_exc = log_error_with_exc
    
    return logger