2024-11-23 17:50:32 +08:00
|
|
|
|
# flask_app/logger_setup.py
|
|
|
|
|
|
|
|
|
|
import logging
|
2024-12-11 17:42:51 +08:00
|
|
|
|
import sys
|
2024-11-23 17:50:32 +08:00
|
|
|
|
import uuid
|
|
|
|
|
from datetime import datetime, timedelta
|
2024-12-11 17:42:51 +08:00
|
|
|
|
from logging.handlers import RotatingFileHandler
|
|
|
|
|
|
2024-11-23 17:50:32 +08:00
|
|
|
|
from flask import g
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
class CSTFormatter(logging.Formatter):
|
|
|
|
|
"""自定义的 Formatter,将日志的时间戳调整为中国标准时间(UTC+8)"""
|
|
|
|
|
|
|
|
|
|
def formatTime(self, record, datefmt=None):
|
|
|
|
|
ct = datetime.fromtimestamp(record.created) + timedelta(hours=8)
|
|
|
|
|
if datefmt:
|
|
|
|
|
s = ct.strftime(datefmt)
|
|
|
|
|
else:
|
|
|
|
|
try:
|
|
|
|
|
s = ct.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
if self.usesTime():
|
|
|
|
|
s = f"{s},{record.msecs:03d}"
|
|
|
|
|
except ValueError:
|
|
|
|
|
s = ct.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
|
return s
|
|
|
|
|
|
2024-12-11 17:42:51 +08:00
|
|
|
|
def create_logger_main(log_name, log_dir='/flask_project/flask_app/static/output', max_bytes=10*1024*1024, backup_count=5):
|
|
|
|
|
"""
|
2025-02-15 13:24:45 +08:00
|
|
|
|
根据名称创建全局日志记录器,并将日志写入指定的 .txt 文件中。
|
2024-12-11 17:42:51 +08:00
|
|
|
|
"""
|
|
|
|
|
os.makedirs(log_dir, exist_ok=True) # 确保日志目录存在
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(log_name)
|
|
|
|
|
if not logger.hasHandlers(): # 防止重复添加处理器
|
|
|
|
|
logger.setLevel(logging.INFO)
|
|
|
|
|
|
2025-02-15 13:24:45 +08:00
|
|
|
|
# 将文件名设置为 model_log.txt(如果 log_name 为 "model_log")
|
|
|
|
|
log_file_path = os.path.join(log_dir, f'{log_name}.txt')
|
2024-12-11 17:42:51 +08:00
|
|
|
|
file_handler = RotatingFileHandler(
|
2025-02-15 13:24:45 +08:00
|
|
|
|
log_file_path,
|
2024-12-11 17:42:51 +08:00
|
|
|
|
maxBytes=max_bytes,
|
|
|
|
|
backupCount=backup_count,
|
|
|
|
|
encoding='utf-8'
|
|
|
|
|
)
|
|
|
|
|
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
|
|
|
|
|
logger.addHandler(file_handler)
|
|
|
|
|
|
|
|
|
|
return logger
|
2024-11-23 17:50:32 +08:00
|
|
|
|
def create_logger(app, subfolder):
|
|
|
|
|
"""
|
|
|
|
|
创建一个唯一的 logger 和对应的输出文件夹。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
subfolder (str): 子文件夹名称,如 'output1', 'output2', 'output3'
|
|
|
|
|
"""
|
|
|
|
|
unique_id = str(uuid.uuid4())
|
|
|
|
|
g.unique_id = unique_id
|
|
|
|
|
output_folder = os.path.join("flask_app", "static", "output", subfolder, unique_id)
|
|
|
|
|
os.makedirs(output_folder, exist_ok=True)
|
|
|
|
|
log_filename = "log.txt"
|
|
|
|
|
log_path = os.path.join(output_folder, log_filename)
|
|
|
|
|
logger = logging.getLogger(unique_id)
|
|
|
|
|
if not logger.handlers:
|
|
|
|
|
file_handler = logging.FileHandler(log_path)
|
|
|
|
|
file_formatter = CSTFormatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
|
|
|
file_handler.setFormatter(file_formatter)
|
|
|
|
|
logger.addHandler(file_handler)
|
2025-02-20 17:20:03 +08:00
|
|
|
|
# stream_handler = logging.StreamHandler()
|
|
|
|
|
# stream_handler.setFormatter(logging.Formatter('%(message)s'))
|
|
|
|
|
# logger.addHandler(stream_handler)
|
2025-02-18 15:45:07 +08:00
|
|
|
|
logger.setLevel(logging.INFO) #Logger 只会处理大于或等于 INFO 级别的日志消息(例如 INFO、WARNING、ERROR、CRITICAL),而 DEBUG 级别的消息会被忽略。
|
2024-12-05 11:42:36 +08:00
|
|
|
|
logger.propagate = False
|
2024-11-23 17:50:32 +08:00
|
|
|
|
g.logger = logger
|
2025-02-07 15:27:24 +08:00
|
|
|
|
g.output_folder = output_folder #输出文件夹路径
|