From 4a080bb409620fbdd7d51895d8e16005c91dda30 Mon Sep 17 00:00:00 2001 From: DingZQ Date: Sun, 18 May 2025 19:19:46 +0800 Subject: [PATCH] Add log to external file --- auto_realtime.py | 48 ++++++++++++++++++++++++-- auto_store_non_realtime_SCADA_data.py | 49 ++++++++++++++++++++++++--- 2 files changed, 89 insertions(+), 8 deletions(-) diff --git a/auto_realtime.py b/auto_realtime.py index 26788bb..b7db0df 100644 --- a/auto_realtime.py +++ b/auto_realtime.py @@ -1,4 +1,7 @@ +from logging.handlers import TimedRotatingFileHandler import influxdb_api +import os +import logging import globals from datetime import datetime, timedelta, timezone import schedule @@ -8,6 +11,45 @@ from influxdb_client import InfluxDBClient, BucketsApi, WriteApi, OrganizationsA import simulation import influxdb_info +def setup_logger(): + # 创建日志目录 + log_dir = "logs" + os.makedirs(log_dir, exist_ok=True) + + # 配置基础日志格式 + log_format = "%(asctime)s - %(levelname)s - %(message)s" + formatter = logging.Formatter(log_format) + + # 创建主 Logger + logger = logging.getLogger() + logger.setLevel(logging.DEBUG) # 全局日志级别 + + # --- 1. 按日期分割的日志文件 Handler --- + log_file = os.path.join(log_dir, "app.log") + file_handler = TimedRotatingFileHandler( + filename=log_file, + when="midnight", # 每天午夜轮转 + interval=1, + backupCount=7, + encoding="utf-8" + ) + file_handler.suffix = "simulation-%Y-%m-%d.log" # 文件名格式 + file_handler.setFormatter(formatter) + file_handler.setLevel(logging.DEBUG) # 文件记录所有级别日志 + + # --- 2. 控制台实时输出 Handler --- + console_handler = logging.StreamHandler() # 默认输出到 sys.stderr (控制台) + console_handler.setFormatter(formatter) + console_handler.setLevel(logging.INFO) # 控制台仅显示 INFO 及以上级别 + + # 将 Handler 添加到 Logger + logger.addHandler(file_handler) + logger.addHandler(console_handler) + + return logger + +logger = setup_logger() + # 2025/02/01 def get_next_time() -> str: """ @@ -31,7 +73,7 @@ def store_realtime_SCADA_data_job() -> None: get_real_value_time: str = get_next_time() # get_real_value_time 类型为 str,格式为'2025-02-01T18:45:00+08:00' # 调用函数执行任务 influxdb_api.store_realtime_SCADA_data_to_influxdb(get_real_value_time) - print('{} -- Successfully store realtime SCADA data.'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) + logger.info('{} -- Successfully store realtime SCADA data.'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) # 2025/02/06 @@ -75,9 +117,9 @@ def run_simulation_job() -> None: # print(modify_pattern_start_time) simulation.run_simulation(name='bb', simulation_type="realtime", modify_pattern_start_time=modify_pattern_start_time) - print('{} -- Successfully run simulation and store realtime simulation result.'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) + logger.info('{} -- Successfully run simulation and store realtime simulation result.'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) else: - print(f"{current_time.strftime('%Y-%m-%d %H:%M:%S')} -- Skipping the simulation task.") + logger.info(f"{current_time.strftime('%Y-%m-%d %H:%M:%S')} -- Skipping the simulation task.") # 2025/02/06 diff --git a/auto_store_non_realtime_SCADA_data.py b/auto_store_non_realtime_SCADA_data.py index 81af4a0..4bd538d 100644 --- a/auto_store_non_realtime_SCADA_data.py +++ b/auto_store_non_realtime_SCADA_data.py @@ -2,10 +2,50 @@ import influxdb_api import globals from datetime import datetime, timedelta, timezone import schedule +import os +import logging +from logging.handlers import TimedRotatingFileHandler import time from influxdb_client import InfluxDBClient, BucketsApi, WriteApi, OrganizationsApi, Point, QueryApi import influxdb_info +def setup_logger(): + # 创建日志目录 + log_dir = "logs" + os.makedirs(log_dir, exist_ok=True) + + # 配置基础日志格式 + log_format = "%(asctime)s - %(levelname)s - %(message)s" + formatter = logging.Formatter(log_format) + + # 创建主 Logger + logger = logging.getLogger() + logger.setLevel(logging.DEBUG) # 全局日志级别 + + # --- 1. 按日期分割的日志文件 Handler --- + log_file = os.path.join(log_dir, "app.log") + file_handler = TimedRotatingFileHandler( + filename=log_file, + when="midnight", # 每天午夜轮转 + interval=1, + backupCount=7, + encoding="utf-8" + ) + file_handler.suffix = "scada-%Y-%m-%d.log" # 文件名格式 + file_handler.setFormatter(formatter) + file_handler.setLevel(logging.DEBUG) # 文件记录所有级别日志 + + # --- 2. 控制台实时输出 Handler --- + console_handler = logging.StreamHandler() # 默认输出到 sys.stderr (控制台) + console_handler.setFormatter(formatter) + console_handler.setLevel(logging.INFO) # 控制台仅显示 INFO 及以上级别 + + # 将 Handler 添加到 Logger + logger.addHandler(file_handler) + logger.addHandler(console_handler) + +logger = setup_logger() + # 2025/02/01 def get_next_time() -> str: """ @@ -49,16 +89,15 @@ def store_non_realtime_SCADA_data_job() -> None: # 只在0点、6点、12点、18点执行任务 # if current_time.hour % 6 == 0 and current_time.minute == 0: if current_time.minute % 10 == 0: - print(f"{current_time.strftime('%Y-%m-%d %H:%M:%S')} -- Start store non realtime SCADA data task.") + logger.info(f"{current_time.strftime('%Y-%m-%d %H:%M:%S')} -- Start store non realtime SCADA data task.") # 获取下一个6小时的时间点,并更新get_history_data_end_time get_history_data_end_time: str = get_next_time() # get_history_data_end_time 类型为 str,格式为'2025-02-06T12:00:00+08:00' # print(get_next_time) # 调用函数执行任务 influxdb_api.store_non_realtime_SCADA_data_to_influxdb(get_history_data_end_time) - print('{} -- Successfully store non realtime SCADA data.'.format( - datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) + logger.info('{} -- Successfully store non realtime SCADA data.'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) else: - print(f"{current_time.strftime('%Y-%m-%d %H:%M:%S')} -- Skipping store non realtime SCADA data task.") + logger.info(f"{current_time.strftime('%Y-%m-%d %H:%M:%S')} -- Skipping store non realtime SCADA data task.") # 2025/02/06 @@ -81,7 +120,7 @@ def store_non_realtime_SCADA_data_task() -> None: time.sleep(1) # 暂停1秒,避免过于频繁的任务检查 pass except Exception as e: - print(f"Error occurred in store_non_realtime_SCADA_data_task: {e}") + logger.error(f"Error occurred in store_non_realtime_SCADA_data_task: {e}") if __name__ == "__main__":