feat(日志): 添加测试脚本日志文件输出并更新日志文档

添加测试脚本日志文件输出功能,创建日志目录并设置权限。同时更新README.md文档,详细说明生产环境中各类日志的查看方法和常见问题解决方案。
This commit is contained in:
2026-01-17 22:03:37 +08:00
parent 2921ab8dda
commit 3776de8477
2 changed files with 219 additions and 0 deletions

193
README.md
View File

@@ -799,6 +799,199 @@ sudo supervisorctl update
sudo supervisorctl restart celery_worker celery_beat
```
### 5.1 日志文件查看指南
在生产环境中,有多种日志来源,了解每种日志的位置和查看方法非常重要:
#### 5.1.1 Celery Worker 和 Beat 日志
这些日志由 Celery 进程产生,需要先创建日志目录:
```bash
# 创建日志目录
sudo mkdir -p /var/log/celery/
# 设置权限
sudo chown -R www-data:www-data /var/log/celery/
sudo chmod -R 755 /var/log/celery/
```
查看日志:
```bash
# 实时查看 Worker 日志
tail -f /var/log/celery/worker.log
# 实时查看 Beat 日志
tail -f /var/log/celery/beat.log
# 查看最近50行
tail -n 50 /var/log/celery/worker.log
# 搜索错误信息
grep -i error /var/log/celery/worker.log
# 搜索特定任务
grep -i "generate_daily_pdf_report" /var/log/celery/worker.log
```
#### 5.1.2 测试脚本日志
运行测试脚本时,日志会同时输出到控制台和文件:
```bash
# 运行测试脚本(输出到控制台)
python test_redis_celery.py
# 查看测试日志文件
tail -f /var/log/celery/test_redis_celery.log
# 运行测试并保存到文件
python test_redis_celery.py 2>&1 | tee /var/log/celery/test_output.log
```
测试脚本日志内容示例:
```
2024-01-15 10:30:00 | INFO | 开始测试Redis连接...
2024-01-15 10:30:01 | SUCCESS | Redis连接测试通过
2024-01-15 10:30:02 | INFO | 开始测试Celery与Redis集成...
2024-01-15 10:30:03 | SUCCESS | Celery与Redis集成测试通过
```
#### 5.1.3 Redis 日志
Redis 的日志通常在系统日志中:
```bash
# 查看 Redis 系统日志
sudo journalctl -u redis-server -f
# 查看 Redis 错误日志
sudo tail -f /var/log/redis/redis-server.log
# 查看所有 Redis 相关日志
sudo grep -i redis /var/log/syslog
```
#### 5.1.4 Django 应用日志
```bash
# 查看 Django 应用日志
tail -f /path/to/diary-family/logs/app.log
# 查看 Gunicorn 日志
sudo tail -f /var/log/gunicorn/access.log
sudo tail -f /var/log/gunicorn/error.log
```
#### 5.1.5 Nginx 日志
```bash
# 查看访问日志
sudo tail -f /var/log/nginx/access.log
# 查看错误日志
sudo tail -f /var/log/nginx/error.log
```
#### 5.1.6 综合日志查看脚本
创建一个综合日志查看脚本:
```bash
#!/bin/bash
# save as: /usr/local/bin/view-all-logs
echo "=== Celery Worker Log ==="
tail -n 20 /var/log/celery/worker.log
echo -e "\n=== Celery Beat Log ==="
tail -n 20 /var/log/celery/beat.log
echo -e "\n=== Redis Server Log ==="
sudo tail -n 20 /var/log/redis/redis-server.log
echo -e "\n=== Nginx Error Log ==="
sudo tail -n 20 /var/log/nginx/error.log
```
使用方法:
```bash
# 给脚本添加执行权限
sudo chmod +x /usr/local/bin/view-all-logs
# 运行脚本
view-all-logs
```
#### 5.1.7 日志轮转配置
为防止日志文件过大,配置日志轮转:
创建 `/etc/logrotate.d/celery-app`
```
/var/log/celery/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
supervisorctl restart celery_worker celery_beat > /dev/null 2>&1 || true
endscript
}
```
启用配置:
```bash
sudo logrotate -f /etc/logrotate.d/celery-app
```
#### 5.1.8 日志查看常见问题
**问题1日志文件权限被拒绝**
```bash
# 检查权限
ls -la /var/log/celery/
# 如果权限不对,重新设置
sudo chown -R www-data:www-data /var/log/celery/
sudo chmod -R 755 /var/log/celery/
```
**问题2日志文件不存在**
```bash
# 检查目录是否存在
ls -la /var/log/ | grep celery
# 如果不存在,创建目录
sudo mkdir -p /var/log/celery/
sudo chown www-data:www-data /var/log/celery/
```
**问题3日志不更新**
```bash
# 检查进程是否运行
ps aux | grep celery
# 检查文件是否被锁定
sudo lsof /var/log/celery/worker.log
# 检查磁盘空间
df -h /var/log/
```
**问题4如何清理旧日志**
```bash
# 删除7天前的日志
find /var/log/celery/ -name "*.log.*.gz" -mtime +7 -delete
# 清空当前日志文件(谨慎使用)
sudo truncate -s 0 /var/log/celery/worker.log
```
### 6. 试运行周期任务
当设置一个周期任务后,您可以通过以下方式试运行任务,而不需要等待到指定的时间:

View File

@@ -361,14 +361,40 @@ def main():
return 1
if __name__ == "__main__":
import os
from pathlib import Path
# 配置日志
logger.remove()
# 创建日志目录
log_dir = Path("/var/log/celery")
log_dir.mkdir(parents=True, exist_ok=True)
# 设置日志文件权限
log_dir.chmod(0o755)
# 添加控制台输出
logger.add(
sys.stdout,
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
level="INFO"
)
# 添加日志文件输出
log_file = log_dir / "test_redis_celery.log"
logger.add(
log_file,
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
level="INFO",
rotation="1 day",
retention="7 days",
encoding="utf-8"
)
logger.info(f"测试日志将同时输出到控制台和 {log_file}")
logger.info("=" * 60)
try:
exit_code = main()
sys.exit(exit_code)