base_daily_logs_generate.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. # -*- coding: utf-8 -*-
  2. """
  3. 用于青龙面板的日志初始化脚本
  4. 每天 00:00:00 执行,创建当天的日志记录
  5. """
  6. import os
  7. import sys
  8. import time
  9. import logging
  10. from datetime import datetime
  11. from typing import Dict, Any
  12. # 添加项目路径
  13. sys.path.append(os.path.join(os.path.abspath(__file__).split('AutoInfo')[0] + 'AutoInfo'))
  14. from utils.utils import *
  15. # 配置日志
  16. logging.basicConfig(
  17. level=logging.INFO,
  18. format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
  19. )
  20. logger = logging.getLogger(__name__)
  21. class Config:
  22. """配置管理类"""
  23. _instance = None
  24. def __new__(cls):
  25. if cls._instance is None:
  26. cls._instance = super().__new__(cls)
  27. cls._instance._load_config()
  28. return cls._instance
  29. def _load_config(self):
  30. """加载配置"""
  31. try:
  32. config_json = LoadConfig().load_config()
  33. self.PROJECT_NAME = config_json.get('PROJECT_NAME', 'AutoInfo')
  34. self.DB_USER = config_json.get('DB_USER', '')
  35. self.DB_PASSWORD = config_json.get('DB_PASSWORD', '')
  36. self.DB_IP = config_json.get('DB_IP', 'localhost')
  37. self.DB_PORT = config_json.get('DB_PORT', 27017)
  38. self.MAIL_HOST = config_json.get('MAIL_HOST', '')
  39. self.MAIL_USER = config_json.get('MAIL_USER', '')
  40. self.MAIL_PASS = config_json.get('MAIL_PASS', '')
  41. self.MAIL_SENDER = config_json.get('MAIL_SENDER', '')
  42. self.MAIL_RECEIVERS = config_json.get('MAIL_RECEIVERS', [])
  43. # 构建MongoDB连接字符串
  44. if self.DB_USER and self.DB_PASSWORD:
  45. self.MONGO_LINK = f'mongodb://{self.DB_USER}:{self.DB_PASSWORD}@{self.DB_IP}:{self.DB_PORT}/?authSource=admin'
  46. else:
  47. self.MONGO_LINK = f'mongodb://{self.DB_IP}:{self.DB_PORT}/'
  48. except Exception as e:
  49. logger.error(f"加载配置失败: {e}")
  50. raise
  51. class MongoHandle:
  52. """MongoDB操作处理类"""
  53. def __init__(self, db: str, collection: str, del_db: bool = False,
  54. del_collection: bool = False, auto_remove: int = 0):
  55. """
  56. 初始化MongoDB连接
  57. Args:
  58. db: 数据库名
  59. collection: 集合名
  60. del_db: 是否删除数据库
  61. del_collection: 是否删除集合
  62. auto_remove: 自动删除数据的天数阈值
  63. """
  64. self.config = Config()
  65. logger.info(f"连接数据库: {self.config.MONGO_LINK}")
  66. try:
  67. self.client = pymongo.MongoClient(
  68. self.config.MONGO_LINK,
  69. serverSelectionTimeoutMS=5000 # 5秒超时
  70. )
  71. # 测试连接
  72. self.client.admin.command('ismaster')
  73. self.db_name = db
  74. self.collection_name = collection
  75. self._setup_database(del_db, del_collection)
  76. if auto_remove > 0:
  77. self.auto_remove_data(auto_remove)
  78. except pymongo.errors.ServerSelectionTimeoutError:
  79. logger.error("无法连接到MongoDB服务器")
  80. raise
  81. except Exception as e:
  82. logger.error(f"数据库初始化失败: {e}")
  83. raise
  84. def _setup_database(self, del_db: bool, del_collection: bool):
  85. """设置数据库和集合"""
  86. if del_db and self.db_name:
  87. if self.db_name in self.client.list_database_names():
  88. self.client.drop_database(self.db_name)
  89. logger.info(f"已删除数据库: {self.db_name}")
  90. self.db = self.client[self.db_name]
  91. if del_collection and self.collection_name:
  92. if self.collection_name in self.db.list_collection_names():
  93. self.db.drop_collection(self.collection_name)
  94. logger.info(f"已删除集合: {self.collection_name}")
  95. self.collection = self.db[self.collection_name]
  96. def write_data(self, data: Dict[str, Any]) -> bool:
  97. """写入数据"""
  98. try:
  99. result = self.collection.insert_one(data)
  100. logger.debug(f"数据插入成功, ID: {result.inserted_id}")
  101. return True
  102. except Exception as e:
  103. logger.error(f"数据插入失败: {e}")
  104. return False
  105. def auto_remove_data(self, days: int):
  106. """自动删除指定天数前的数据"""
  107. try:
  108. cutoff_time = int(time.time()) - days * 24 * 60 * 60
  109. result = self.collection.delete_many({
  110. 'create_time': {'$lt': cutoff_time}
  111. })
  112. if result.deleted_count > 0:
  113. logger.info(f"已删除 {result.deleted_count} 条过期数据")
  114. except Exception as e:
  115. logger.error(f"自动删除数据失败: {e}")
  116. def close(self):
  117. """关闭数据库连接"""
  118. if hasattr(self, 'client'):
  119. self.client.close()
  120. logger.info("数据库连接已关闭")
  121. class LogsHandler:
  122. """日志处理类"""
  123. def __init__(self):
  124. self.config = Config()
  125. self.now_day = datetime.now().strftime('%Y-%m-%d')
  126. self.mongo = None
  127. self._setup_mongo()
  128. def _setup_mongo(self):
  129. """设置MongoDB连接"""
  130. try:
  131. self.mongo = MongoHandle(
  132. db='logs',
  133. collection=f'logs_{self.now_day}',
  134. del_db=False,
  135. del_collection=False,
  136. auto_remove=0 # 不自动删除,由其他机制处理
  137. )
  138. except Exception as e:
  139. logger.error(f"初始化MongoDB连接失败: {e}")
  140. raise
  141. def logs_generate(self) -> bool:
  142. """生成当天的日志记录"""
  143. data_to_insert = {
  144. "title": "daily_log_init",
  145. "context": f"Daily log collection created for {self.now_day}",
  146. "state": "created",
  147. "create_time": int(time.time()),
  148. "create_datetime": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
  149. "project": self.config.PROJECT_NAME
  150. }
  151. try:
  152. success = self.mongo.write_data(data_to_insert)
  153. if success:
  154. logger.info(f"成功创建当天日志记录: {self.now_day}")
  155. return success
  156. except Exception as e:
  157. logger.error(f"创建日志记录失败: {e}")
  158. return False
  159. def cleanup(self):
  160. """清理资源"""
  161. if self.mongo:
  162. self.mongo.close()
  163. def main():
  164. """主函数"""
  165. logger.info("开始创建当天日志记录...")
  166. logs_handler = None
  167. try:
  168. logs_handler = LogsHandler()
  169. success = logs_handler.logs_generate()
  170. if success:
  171. logger.info("当天日志记录创建成功")
  172. return 0
  173. else:
  174. logger.error("当天日志记录创建失败")
  175. return 1
  176. except Exception as e:
  177. logger.error(f"执行过程中发生错误: {e}")
  178. return 1
  179. finally:
  180. if logs_handler:
  181. logs_handler.cleanup()
  182. if __name__ == '__main__':
  183. exit_code = main()
  184. sys.exit(exit_code)