Spaces:
Running
Running
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 |