| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- # -*- coding: utf-8 -*-
- """
- 用于青龙面板的日志初始化脚本
- 每天 00:00:00 执行,创建当天的日志记录
- """
- import os
- import sys
- import time
- import logging
- from datetime import datetime
- from typing import Dict, Any
- # 添加项目路径
- sys.path.append(os.path.join(os.path.abspath(__file__).split('AutoInfo')[0] + 'AutoInfo'))
- from utils.utils import *
- # 配置日志
- logging.basicConfig(
- level=logging.INFO,
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
- )
- logger = logging.getLogger(__name__)
- class Config:
- """配置管理类"""
- _instance = None
- def __new__(cls):
- if cls._instance is None:
- cls._instance = super().__new__(cls)
- cls._instance._load_config()
- return cls._instance
- def _load_config(self):
- """加载配置"""
- try:
- config_json = LoadConfig().load_config()
- self.PROJECT_NAME = config_json.get('PROJECT_NAME', 'AutoInfo')
- self.DB_USER = config_json.get('DB_USER', '')
- self.DB_PASSWORD = config_json.get('DB_PASSWORD', '')
- self.DB_IP = config_json.get('DB_IP', 'localhost')
- self.DB_PORT = config_json.get('DB_PORT', 27017)
- self.MAIL_HOST = config_json.get('MAIL_HOST', '')
- self.MAIL_USER = config_json.get('MAIL_USER', '')
- self.MAIL_PASS = config_json.get('MAIL_PASS', '')
- self.MAIL_SENDER = config_json.get('MAIL_SENDER', '')
- self.MAIL_RECEIVERS = config_json.get('MAIL_RECEIVERS', [])
- # 构建MongoDB连接字符串
- if self.DB_USER and self.DB_PASSWORD:
- self.MONGO_LINK = f'mongodb://{self.DB_USER}:{self.DB_PASSWORD}@{self.DB_IP}:{self.DB_PORT}/?authSource=admin'
- else:
- self.MONGO_LINK = f'mongodb://{self.DB_IP}:{self.DB_PORT}/'
- except Exception as e:
- logger.error(f"加载配置失败: {e}")
- raise
- class MongoHandle:
- """MongoDB操作处理类"""
- def __init__(self, db: str, collection: str, del_db: bool = False,
- del_collection: bool = False, auto_remove: int = 0):
- """
- 初始化MongoDB连接
- Args:
- db: 数据库名
- collection: 集合名
- del_db: 是否删除数据库
- del_collection: 是否删除集合
- auto_remove: 自动删除数据的天数阈值
- """
- self.config = Config()
- logger.info(f"连接数据库: {self.config.MONGO_LINK}")
- try:
- self.client = pymongo.MongoClient(
- self.config.MONGO_LINK,
- serverSelectionTimeoutMS=5000 # 5秒超时
- )
- # 测试连接
- self.client.admin.command('ismaster')
- self.db_name = db
- self.collection_name = collection
- self._setup_database(del_db, del_collection)
- if auto_remove > 0:
- self.auto_remove_data(auto_remove)
- except pymongo.errors.ServerSelectionTimeoutError:
- logger.error("无法连接到MongoDB服务器")
- raise
- except Exception as e:
- logger.error(f"数据库初始化失败: {e}")
- raise
- def _setup_database(self, del_db: bool, del_collection: bool):
- """设置数据库和集合"""
- if del_db and self.db_name:
- if self.db_name in self.client.list_database_names():
- self.client.drop_database(self.db_name)
- logger.info(f"已删除数据库: {self.db_name}")
- self.db = self.client[self.db_name]
- if del_collection and self.collection_name:
- if self.collection_name in self.db.list_collection_names():
- self.db.drop_collection(self.collection_name)
- logger.info(f"已删除集合: {self.collection_name}")
- self.collection = self.db[self.collection_name]
- def write_data(self, data: Dict[str, Any]) -> bool:
- """写入数据"""
- try:
- result = self.collection.insert_one(data)
- logger.debug(f"数据插入成功, ID: {result.inserted_id}")
- return True
- except Exception as e:
- logger.error(f"数据插入失败: {e}")
- return False
- def auto_remove_data(self, days: int):
- """自动删除指定天数前的数据"""
- try:
- cutoff_time = int(time.time()) - days * 24 * 60 * 60
- result = self.collection.delete_many({
- 'create_time': {'$lt': cutoff_time}
- })
- if result.deleted_count > 0:
- logger.info(f"已删除 {result.deleted_count} 条过期数据")
- except Exception as e:
- logger.error(f"自动删除数据失败: {e}")
- def close(self):
- """关闭数据库连接"""
- if hasattr(self, 'client'):
- self.client.close()
- logger.info("数据库连接已关闭")
- class LogsHandler:
- """日志处理类"""
- def __init__(self):
- self.config = Config()
- self.now_day = datetime.now().strftime('%Y-%m-%d')
- self.mongo = None
- self._setup_mongo()
- def _setup_mongo(self):
- """设置MongoDB连接"""
- try:
- self.mongo = MongoHandle(
- db='logs',
- collection=f'logs_{self.now_day}',
- del_db=False,
- del_collection=False,
- auto_remove=0 # 不自动删除,由其他机制处理
- )
- except Exception as e:
- logger.error(f"初始化MongoDB连接失败: {e}")
- raise
- def logs_generate(self) -> bool:
- """生成当天的日志记录"""
- data_to_insert = {
- "title": "daily_log_init",
- "context": f"Daily log collection created for {self.now_day}",
- "state": "created",
- "create_time": int(time.time()),
- "create_datetime": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
- "project": self.config.PROJECT_NAME
- }
- try:
- success = self.mongo.write_data(data_to_insert)
- if success:
- logger.info(f"成功创建当天日志记录: {self.now_day}")
- return success
- except Exception as e:
- logger.error(f"创建日志记录失败: {e}")
- return False
- def cleanup(self):
- """清理资源"""
- if self.mongo:
- self.mongo.close()
- def main():
- """主函数"""
- logger.info("开始创建当天日志记录...")
- logs_handler = None
- try:
- logs_handler = LogsHandler()
- success = logs_handler.logs_generate()
- if success:
- logger.info("当天日志记录创建成功")
- return 0
- else:
- logger.error("当天日志记录创建失败")
- return 1
- except Exception as e:
- logger.error(f"执行过程中发生错误: {e}")
- return 1
- finally:
- if logs_handler:
- logs_handler.cleanup()
- if __name__ == '__main__':
- exit_code = main()
- sys.exit(exit_code)
|