3 changed files with 501 additions and 1 deletions
@ -0,0 +1,202 @@ |
|||
#!/usr/bin/env python3 |
|||
""" |
|||
日志系统诊断脚本 |
|||
用于排查新环境中日志文件无法创建的问题 |
|||
""" |
|||
import os |
|||
import sys |
|||
import logging |
|||
import traceback |
|||
from datetime import datetime |
|||
|
|||
def check_environment(): |
|||
"""检查环境信息""" |
|||
print("=" * 60) |
|||
print("环境诊断信息") |
|||
print("=" * 60) |
|||
print(f"Python版本: {sys.version}") |
|||
print(f"当前工作目录: {os.getcwd()}") |
|||
print(f"当前用户: {os.getenv('USERNAME', 'Unknown')}") |
|||
print(f"操作系统: {os.name}") |
|||
print(f"平台: {sys.platform}") |
|||
|
|||
# 检查logs目录 |
|||
logs_dir = "logs" |
|||
print(f"\nlogs目录检查:") |
|||
print(f" logs目录是否存在: {os.path.exists(logs_dir)}") |
|||
|
|||
if os.path.exists(logs_dir): |
|||
try: |
|||
stat_info = os.stat(logs_dir) |
|||
print(f" logs目录权限: {oct(stat_info.st_mode)[-3:]}") |
|||
print(f" logs目录所有者: {stat_info.st_uid}") |
|||
print(f" logs目录大小: {stat_info.st_size} bytes") |
|||
except Exception as e: |
|||
print(f" 获取logs目录信息失败: {e}") |
|||
else: |
|||
print(" logs目录不存在,将尝试创建") |
|||
try: |
|||
os.makedirs(logs_dir, exist_ok=True) |
|||
print(f" logs目录创建成功: {os.path.exists(logs_dir)}") |
|||
except Exception as e: |
|||
print(f" logs目录创建失败: {e}") |
|||
|
|||
def test_basic_logging(): |
|||
"""测试基础日志功能""" |
|||
print("\n" + "=" * 60) |
|||
print("基础日志测试") |
|||
print("=" * 60) |
|||
|
|||
# 测试标准logging模块 |
|||
print("1. 测试标准logging模块:") |
|||
try: |
|||
basic_logger = logging.getLogger("basic_test") |
|||
basic_logger.setLevel(logging.INFO) |
|||
|
|||
# 创建文件处理器 |
|||
file_handler = logging.FileHandler("logs/basic_test.log", encoding='utf-8') |
|||
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) |
|||
basic_logger.addHandler(file_handler) |
|||
|
|||
basic_logger.info("基础日志测试 - INFO") |
|||
basic_logger.error("基础日志测试 - ERROR") |
|||
|
|||
print(" ✅ 基础日志测试成功") |
|||
|
|||
# 检查文件是否创建 |
|||
if os.path.exists("logs/basic_test.log"): |
|||
with open("logs/basic_test.log", "r", encoding='utf-8') as f: |
|||
content = f.read() |
|||
print(f" ✅ 日志文件创建成功,内容长度: {len(content)} 字符") |
|||
else: |
|||
print(" ❌ 日志文件未创建") |
|||
|
|||
except Exception as e: |
|||
print(f" ❌ 基础日志测试失败: {e}") |
|||
traceback.print_exc() |
|||
|
|||
def test_structured_logging(): |
|||
"""测试结构化日志功能""" |
|||
print("\n" + "=" * 60) |
|||
print("结构化日志测试") |
|||
print("=" * 60) |
|||
|
|||
try: |
|||
# 导入结构化日志模块 |
|||
print("1. 导入结构化日志模块:") |
|||
from app.utils.structured_log import get_structured_logger, LogLevel |
|||
print(" ✅ 结构化日志模块导入成功") |
|||
|
|||
# 创建结构化日志记录器 |
|||
print("2. 创建结构化日志记录器:") |
|||
logger = get_structured_logger("debug_test", LogLevel.DEBUG) |
|||
print(" ✅ 结构化日志记录器创建成功") |
|||
|
|||
# 测试日志记录 |
|||
print("3. 测试日志记录:") |
|||
logger.info("结构化日志测试 - INFO", test_param="test_value") |
|||
logger.error("结构化日志测试 - ERROR", error_code=500) |
|||
print(" ✅ 日志记录调用成功") |
|||
|
|||
# 检查日志文件 |
|||
print("4. 检查日志文件:") |
|||
app_log_exists = os.path.exists("logs/app.log") |
|||
error_log_exists = os.path.exists("logs/error.log") |
|||
|
|||
print(f" app.log存在: {app_log_exists}") |
|||
print(f" error.log存在: {error_log_exists}") |
|||
|
|||
if app_log_exists: |
|||
with open("logs/app.log", "r", encoding='utf-8') as f: |
|||
lines = f.readlines() |
|||
print(f" app.log行数: {len(lines)}") |
|||
if lines: |
|||
last_line = lines[-1].strip() |
|||
print(f" 最后一行: {last_line[:100]}...") |
|||
|
|||
if error_log_exists: |
|||
with open("logs/error.log", "r", encoding='utf-8') as f: |
|||
lines = f.readlines() |
|||
print(f" error.log行数: {len(lines)}") |
|||
if lines: |
|||
last_line = lines[-1].strip() |
|||
print(f" 最后一行: {last_line[:100]}...") |
|||
|
|||
print(" ✅ 结构化日志测试完成") |
|||
|
|||
except ImportError as e: |
|||
print(f" ❌ 导入结构化日志模块失败: {e}") |
|||
traceback.print_exc() |
|||
except Exception as e: |
|||
print(f" ❌ 结构化日志测试失败: {e}") |
|||
traceback.print_exc() |
|||
|
|||
def test_file_permissions(): |
|||
"""测试文件权限""" |
|||
print("\n" + "=" * 60) |
|||
print("文件权限测试") |
|||
print("=" * 60) |
|||
|
|||
test_files = [ |
|||
"logs/test_write.txt", |
|||
"logs/test_append.txt" |
|||
] |
|||
|
|||
for test_file in test_files: |
|||
print(f"\n测试文件: {test_file}") |
|||
|
|||
# 测试写入 |
|||
try: |
|||
with open(test_file, "w", encoding='utf-8') as f: |
|||
f.write(f"测试写入 - {datetime.now()}\n") |
|||
print(f" ✅ 写入测试成功") |
|||
except Exception as e: |
|||
print(f" ❌ 写入测试失败: {e}") |
|||
|
|||
# 测试追加 |
|||
try: |
|||
with open(test_file, "a", encoding='utf-8') as f: |
|||
f.write(f"测试追加 - {datetime.now()}\n") |
|||
print(f" ✅ 追加测试成功") |
|||
except Exception as e: |
|||
print(f" ❌ 追加测试失败: {e}") |
|||
|
|||
# 检查文件 |
|||
if os.path.exists(test_file): |
|||
try: |
|||
stat_info = os.stat(test_file) |
|||
print(f" ✅ 文件存在,大小: {stat_info.st_size} bytes") |
|||
except Exception as e: |
|||
print(f" ❌ 获取文件信息失败: {e}") |
|||
else: |
|||
print(f" ❌ 文件不存在") |
|||
|
|||
def main(): |
|||
"""主函数""" |
|||
print("日志系统诊断工具") |
|||
print("=" * 60) |
|||
print(f"诊断时间: {datetime.now()}") |
|||
|
|||
try: |
|||
# 检查环境 |
|||
check_environment() |
|||
|
|||
# 测试基础日志 |
|||
test_basic_logging() |
|||
|
|||
# 测试结构化日志 |
|||
test_structured_logging() |
|||
|
|||
# 测试文件权限 |
|||
test_file_permissions() |
|||
|
|||
print("\n" + "=" * 60) |
|||
print("诊断完成") |
|||
print("=" * 60) |
|||
|
|||
except Exception as e: |
|||
print(f"\n诊断过程中发生错误: {e}") |
|||
traceback.print_exc() |
|||
|
|||
if __name__ == "__main__": |
|||
main() |
|||
@ -0,0 +1,184 @@ |
|||
# 新环境日志问题排查指南 |
|||
|
|||
## 问题描述 |
|||
在新环境中运行应用程序时,日志输出到控制台但没有创建日志文件记录。 |
|||
|
|||
## 快速诊断步骤 |
|||
|
|||
### 1. 运行诊断脚本 |
|||
```bash |
|||
python debug_logging.py |
|||
``` |
|||
|
|||
### 2. 手动测试日志系统 |
|||
```bash |
|||
python -c "from app.utils.structured_log import get_structured_logger, LogLevel; logger = get_structured_logger('test', LogLevel.DEBUG); logger.info('测试日志'); logger.error('测试错误日志')" |
|||
``` |
|||
|
|||
### 3. 检查logs目录 |
|||
```bash |
|||
# 检查logs目录是否存在 |
|||
ls -la logs/ |
|||
|
|||
# 检查日志文件是否创建 |
|||
ls -la logs/app.log logs/error.log |
|||
``` |
|||
|
|||
## 常见问题及解决方案 |
|||
|
|||
### 问题1: logs目录不存在 |
|||
**症状**: 控制台输出日志,但logs目录不存在 |
|||
**解决方案**: |
|||
```python |
|||
# 结构化日志系统会自动创建logs目录 |
|||
# 如果手动创建,确保有写入权限 |
|||
import os |
|||
os.makedirs("logs", exist_ok=True) |
|||
``` |
|||
|
|||
### 问题2: 权限不足 |
|||
**症状**: 日志输出到控制台,但无法创建文件 |
|||
**解决方案**: |
|||
```bash |
|||
# Linux/Mac: 检查目录权限 |
|||
ls -la logs/ |
|||
chmod 755 logs/ |
|||
|
|||
# Windows: 以管理员身份运行或检查文件夹权限 |
|||
# 右键logs文件夹 -> 属性 -> 安全 -> 编辑权限 |
|||
``` |
|||
|
|||
### 问题3: 磁盘空间不足 |
|||
**症状**: 日志输出到控制台,但文件创建失败 |
|||
**解决方案**: |
|||
```bash |
|||
# 检查磁盘空间 |
|||
df -h # Linux/Mac |
|||
dir # Windows |
|||
|
|||
# 清理空间或更改日志目录 |
|||
``` |
|||
|
|||
### 问题4: 路径问题 |
|||
**症状**: 工作目录不正确导致文件创建在错误位置 |
|||
**解决方案**: |
|||
```python |
|||
# 确保在正确的目录下运行 |
|||
import os |
|||
print("当前工作目录:", os.getcwd()) |
|||
print("logs目录绝对路径:", os.path.abspath("logs")) |
|||
``` |
|||
|
|||
### 问题5: 编码问题 |
|||
**症状**: 文件创建但内容乱码或无法写入中文 |
|||
**解决方案**: |
|||
```python |
|||
# 确保使用UTF-8编码 |
|||
file_handler = logging.FileHandler("logs/app.log", encoding='utf-8') |
|||
``` |
|||
|
|||
## 环境检查清单 |
|||
|
|||
### ✅ 基础环境 |
|||
- [ ] Python版本 >= 3.7 |
|||
- [ ] 工作目录正确 |
|||
- [ ] 有足够的磁盘空间 |
|||
- [ ] 有目录写入权限 |
|||
|
|||
### ✅ 日志系统 |
|||
- [ ] 结构化日志模块可以导入 |
|||
- [ ] 日志记录器可以创建 |
|||
- [ ] 日志可以输出到控制台 |
|||
- [ ] logs目录可以创建 |
|||
- [ ] 日志文件可以写入 |
|||
|
|||
### ✅ 文件系统 |
|||
- [ ] logs目录存在且有写入权限 |
|||
- [ ] app.log文件可以创建和写入 |
|||
- [ ] error.log文件可以创建和写入 |
|||
- [ ] 文件编码为UTF-8 |
|||
|
|||
## 调试命令 |
|||
|
|||
### 检查环境信息 |
|||
```bash |
|||
# Python版本 |
|||
python --version |
|||
|
|||
# 当前目录 |
|||
pwd # Linux/Mac |
|||
cd # Windows |
|||
|
|||
# 目录权限 |
|||
ls -la logs/ # Linux/Mac |
|||
dir logs # Windows |
|||
``` |
|||
|
|||
### 测试文件写入 |
|||
```bash |
|||
# 测试基本文件写入 |
|||
python -c "with open('logs/test.txt', 'w') as f: f.write('test')" |
|||
|
|||
# 测试日志文件写入 |
|||
python -c "import logging; logging.basicConfig(filename='logs/test.log'); logging.info('test')" |
|||
``` |
|||
|
|||
### 检查日志文件内容 |
|||
```bash |
|||
# 查看app.log |
|||
tail -f logs/app.log |
|||
|
|||
# 查看error.log |
|||
tail -f logs/error.log |
|||
|
|||
# 统计行数 |
|||
wc -l logs/app.log logs/error.log |
|||
``` |
|||
|
|||
## 日志系统配置 |
|||
|
|||
### 结构化日志配置 |
|||
```python |
|||
from app.utils.structured_log import get_structured_logger, LogLevel |
|||
|
|||
# 创建日志记录器 |
|||
logger = get_structured_logger("module_name", LogLevel.INFO) |
|||
|
|||
# 记录日志 |
|||
logger.info("信息日志", extra_param="value") |
|||
logger.error("错误日志", error_code=500) |
|||
``` |
|||
|
|||
### 日志文件结构 |
|||
``` |
|||
logs/ |
|||
├── app.log # 正常日志(DEBUG、INFO、WARNING) |
|||
├── error.log # 错误日志(ERROR、CRITICAL) |
|||
└── *.log # 其他模块特定日志 |
|||
``` |
|||
|
|||
## 故障排除流程 |
|||
|
|||
1. **运行诊断脚本** → 获取详细环境信息 |
|||
2. **检查基础环境** → 确认Python、目录、权限 |
|||
3. **测试基础日志** → 验证logging模块功能 |
|||
4. **测试结构化日志** → 验证自定义日志系统 |
|||
5. **检查文件权限** → 确认文件系统访问 |
|||
6. **查看错误信息** → 分析具体错误原因 |
|||
|
|||
## 联系支持 |
|||
|
|||
如果按照以上步骤仍无法解决问题,请提供: |
|||
|
|||
1. 诊断脚本的完整输出 |
|||
2. 操作系统和Python版本信息 |
|||
3. 错误信息和堆栈跟踪 |
|||
4. 环境配置信息 |
|||
|
|||
## 预防措施 |
|||
|
|||
1. **定期备份日志配置** |
|||
2. **监控磁盘空间使用** |
|||
3. **设置日志轮转机制** |
|||
4. **定期检查日志文件权限** |
|||
5. **在新环境部署前运行诊断脚本** |
|||
Loading…
Reference in new issue