File size: 2,025 Bytes
3085164
d280cfc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3085164
 
 
 
 
 
 
d280cfc
 
3085164
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d280cfc
 
 
3085164
 
 
 
 
 
 
 
 
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
import logging
import datetime
import os

def custom_timezone_converter(timestamp):
    """
    将时间戳转换为指定时区 (默认 UTC+8/Asia/Shanghai) 的 struct_time。
    时区通过环境变量 TZ_OFFSET (小时数) 配置。
    """
    
    # 尝试从环境变量获取偏移量,默认为 8 (北京时间)
    try:
        offset_hours = float(os.getenv('TZ_OFFSET', 8))
    except (ValueError, TypeError):
        offset_hours = 8

    # 创建时区对象
    target_timezone = datetime.timezone(datetime.timedelta(hours=offset_hours))
    
    # 转换时间
    dt_time = datetime.datetime.fromtimestamp(timestamp, target_timezone)
    return dt_time.timetuple()

def setup_logging(log_file, prefix=None, level=logging.INFO):
    """
    配置日志记录器,使其输出到文件和控制台。
    支持一个可选的前缀,用于标识日志来源。

    每次调用都会重新配置处理器,以适应多进程环境。
    
    时间显示默认为 UTC+8 (北京时间),可通过环境变量 TZ_OFFSET 修改。

    :param log_file: 日志文件的路径。
    :param prefix: (可选) 要添加到每条日志消息开头的字符串前缀。
    :param level: 日志级别。
    """
    logger = logging.getLogger('my_app_logger') 
    logger.setLevel(level)

    if logger.hasHandlers():
        logger.handlers.clear()

    base_format = '%(asctime)s - %(process)d - %(levelname)s - %(message)s'

    if prefix:
        log_format = f'%(asctime)s - %(process)d - %(levelname)s - {prefix} - %(message)s'
    else:
        log_format = base_format

    fh = logging.FileHandler(log_file)
    fh.setLevel(level)

    ch = logging.StreamHandler()
    ch.setLevel(level)

    formatter = logging.Formatter(log_format)
    # 设置自定义的时间转换器
    formatter.converter = custom_timezone_converter

    fh.setFormatter(formatter)
    ch.setFormatter(formatter)

    logger.addHandler(fh)
    logger.addHandler(ch)
    
    logger.propagate = False
    
    return logger