feat(日志): 添加测试脚本日志文件输出并更新日志文档
添加测试脚本日志文件输出功能,创建日志目录并设置权限。同时更新README.md文档,详细说明生产环境中各类日志的查看方法和常见问题解决方案。
This commit is contained in:
193
README.md
193
README.md
@@ -799,6 +799,199 @@ sudo supervisorctl update
|
|||||||
sudo supervisorctl restart celery_worker celery_beat
|
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. 试运行周期任务
|
### 6. 试运行周期任务
|
||||||
|
|
||||||
当设置一个周期任务后,您可以通过以下方式试运行任务,而不需要等待到指定的时间:
|
当设置一个周期任务后,您可以通过以下方式试运行任务,而不需要等待到指定的时间:
|
||||||
|
|||||||
@@ -361,14 +361,40 @@ def main():
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
# 配置日志
|
# 配置日志
|
||||||
logger.remove()
|
logger.remove()
|
||||||
|
|
||||||
|
# 创建日志目录
|
||||||
|
log_dir = Path("/var/log/celery")
|
||||||
|
log_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# 设置日志文件权限
|
||||||
|
log_dir.chmod(0o755)
|
||||||
|
|
||||||
|
# 添加控制台输出
|
||||||
logger.add(
|
logger.add(
|
||||||
sys.stdout,
|
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>",
|
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"
|
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:
|
try:
|
||||||
exit_code = main()
|
exit_code = main()
|
||||||
sys.exit(exit_code)
|
sys.exit(exit_code)
|
||||||
|
|||||||
Reference in New Issue
Block a user