优化flower启动代码

This commit is contained in:
mark.tian
2025-12-09 19:09:29 +08:00
parent 0af7eebed8
commit 38787b1e4e
7 changed files with 224 additions and 20 deletions

105
LOGGING_README.md Normal file
View File

@@ -0,0 +1,105 @@
# 日志系统说明
## 日志配置
项目已配置统一的文件日志系统,所有日志文件存储在 `logs/` 目录下。
## 日志文件
### 1. 主要日志文件
- `logs/call_api_task.log` - 呼叫任务API执行日志
- `logs/celery_app.log` - Celery应用日志
- `logs/app.log` - 应用主日志
### 2. 日志格式
```
2025-12-09 17:34:49 - call_api_task - INFO - 开始遍历API配置文件执行调用任务 - 当前时间: 2025-12-09 17:34:49
```
格式说明:
- 时间戳
- 模块名
- 日志级别 (INFO/WARNING/ERROR)
- 日志消息
## 使用方法
### 1. 在代码中使用日志
```python
from logging_config import get_logger
# 获取logger
logger = get_logger('your_module_name')
# 记录日志
logger.info("信息日志")
logger.warning("警告日志")
logger.error("错误日志")
```
### 2. 查看日志
```bash
# 查看最新日志
tail -f logs/call_api_task.log
# 查看日志文件
ls -la logs/
```
## 日志级别
- **INFO**: 正常执行信息
- **WARNING**: 警告信息,但不影响执行
- **ERROR**: 错误信息,可能导致任务失败
## 日志管理
### 自动创建
- 日志目录 `logs/` 会自动创建
- 日志文件会自动创建和追加
### 日志轮转
- 目前使用简单的追加模式
- 建议定期清理旧的日志文件
## 示例
### 任务执行日志示例
```
2025-12-09 17:34:49 - call_api_task - INFO - 开始遍历API配置文件执行调用任务
2025-12-09 17:34:49 - call_api_task - INFO - 开始处理API配置: main_api
2025-12-09 17:34:49 - call_api_task - INFO - 正在调用任务API: POST https://api.example.com
2025-12-09 17:34:52 - call_api_task - INFO - 任务API调用成功,响应数据: {...}
2025-12-09 17:34:52 - call_api_task - INFO - 遍历API配置文件完成 - 成功: 1/1
```
### 错误日志示例
```
2025-12-09 17:35:15 - call_api_task - WARNING - 任务API需要重试,当前重试次数: 1/3
2025-12-09 17:35:15 - call_api_task - ERROR - 任务API失败,状态码: 500
```
## 故障排查
1. **检查日志目录权限**
```bash
ls -la logs/
```
2. **查看最新错误**
```bash
grep "ERROR" logs/*.log
```
3. **实时监控日志**
```bash
tail -f logs/call_api_task.log
```
## 注意事项
- 日志文件会持续增长,建议定期备份和清理
- 敏感信息不应写入日志文件
- 日志文件使用UTF-8编码

View File

@@ -9,7 +9,6 @@
- `run_flower.py`: 启动Flower监控的脚本 - `run_flower.py`: 启动Flower监控的脚本
- `flower_config.py`: Flower监控配置 - `flower_config.py`: Flower监控配置
- `start_all.py`: 一键启动所有服务 - `start_all.py`: 一键启动所有服务
- `test_task.py`: 测试脚本
## 安装依赖 ## 安装依赖
```bash ```bash

View File

@@ -4,8 +4,10 @@ from datetime import datetime
import logging import logging
import requests import requests
from api_config import API_CONFIG, RETRY_CONFIG from api_config import API_CONFIG, RETRY_CONFIG
from logging_config import get_logger
logger = logging.getLogger(__name__) # 获取配置好的logger
logger = get_logger('call_api_task')
@app.task(bind=True, name='call_api', max_retries=None) @app.task(bind=True, name='call_api', max_retries=None)
def execute_call_api_task(self): def execute_call_api_task(self):

View File

@@ -1,10 +1,14 @@
from celery import Celery from celery import Celery
from datetime import datetime from datetime import datetime
import logging import logging
from logging_config import get_logger
# 配置日志 # 配置基本日志
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 获取配置好的logger
logger = get_logger('celery')
celery_logger = get_logger('celery_app')
# 创建Celery应用 # 创建Celery应用
app = Celery( app = Celery(

View File

@@ -6,7 +6,7 @@ FLOWER_CONFIG = {
'result_backend': 'redis://localhost:6379/0', 'result_backend': 'redis://localhost:6379/0',
'port': 5555, 'port': 5555,
'address': '0.0.0.0', # 允许外部访问 'address': '0.0.0.0', # 允许外部访问
'basic_auth': None, # 基础认证,格式: 'username:password' 'basic_auth': 'admin:admin123', # 基础认证,格式: 'username:password'
'oauth_redirect_url': None, 'oauth_redirect_url': None,
'db': None, # 使用SQLite存储监控数据 'db': None, # 使用SQLite存储监控数据
'inspect_timeout': 1000, 'inspect_timeout': 1000,

69
logging_config.py Normal file
View File

@@ -0,0 +1,69 @@
"""统一日志配置模块"""
import logging
import os
from datetime import datetime
def setup_logging(logger_name, log_filename=None):
"""
设置统一的文件日志配置
Args:
logger_name: logger名称
log_filename: 日志文件名,如果不提供则使用logger_name
Returns:
configured logger: 配置好的logger
"""
# 创建日志目录
log_dir = "logs"
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# 设置日志文件名
if log_filename is None:
log_filename = f"{logger_name}.log"
log_file = os.path.join(log_dir, log_filename)
# 配置文件处理器
file_handler = logging.FileHandler(log_file, encoding='utf-8')
file_handler.setLevel(logging.INFO)
# 设置日志格式
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
file_handler.setFormatter(formatter)
# 获取或创建logger
logger = logging.getLogger(logger_name)
# 避免重复添加handler
if not logger.handlers:
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)
return logger
def get_logger(logger_name):
"""获取配置好的logger"""
return setup_logging(logger_name)
# 全局日志配置
def setup_global_logging():
"""设置全局应用日志"""
# 应用主日志
app_logger = setup_logging('app', 'app_main.log')
# Celery日志
celery_logger = setup_logging('celery', 'celery_app.log')
# 任务日志
task_logger = setup_logging('call_api_task', 'call_api_tasks.log')
return {
'app': app_logger,
'celery': celery_logger,
'call_api_task': task_logger
}

View File

@@ -1,25 +1,50 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""启动Flower监控服务""" """启动Flower监控服务"""
from celery import Celery import os
from flower import command as flower_command import sys
import subprocess
from celery_app import app
from flower_config import FLOWER_CONFIG
def start_flower(): def start_flower():
"""启动Flower监控""" """启动Flower监控"""
print("启动Flower监控服务...") print("启动Flower监控服务...")
print("监控地址: http://localhost:5555") print(f"监控地址: http://localhost:{FLOWER_CONFIG['port']}")
print("按 Ctrl+C 停止服务") print("按 Ctrl+C 停止服务")
# Flower配置 try:
flower_options = { # 使用celery_app中的app对象启动flower
'broker': 'redis://localhost:6379/0', app.worker_main(['flower',
'port': 5555, '--broker', app.conf.broker_url,
'basic_auth': None, # 可以设置用户名:密码,如 'admin:password' '--port', str(FLOWER_CONFIG['port']),
'inspect_timeout': 1000, '--address', FLOWER_CONFIG['address'],
'purge_offline_workers': 60, '--inspect_timeout', str(FLOWER_CONFIG['inspect_timeout']),
} '--purge_offline_workers', str(FLOWER_CONFIG['purge_offline_workers']),
'--enable_events',
# 启动Flower 'true' if FLOWER_CONFIG['enable_events'] else 'false'])
flower_command.flower_command(flower_options) except KeyboardInterrupt:
print("\nFlower监控服务已停止")
except Exception as e:
print(f"启动Flower失败: {e}")
print("请检查:")
print("1. Redis是否正在运行 (redis-server)")
print("2. 端口5555是否被占用")
print("3. Celery worker是否正在运行")
def start_flower_simple():
"""简单启动方式"""
print("尝试简单启动Flower...")
try:
# 使用celery_app中的app对象简单启动
app.worker_main(['flower', '--broker=redis://localhost:6379/0', '--port=5555', '--address=127.0.0.1'])
except Exception as e:
print(f"简单启动失败: {e}")
if __name__ == '__main__': if __name__ == '__main__':
start_flower() # 先尝试正常启动
try:
start_flower()
except Exception as e:
print(f"正常启动失败: {e}")
print("尝试简单启动...")
start_flower_simple()