Commit 9650daf5 by Yuhaibo

1

parent c94177be
# DebugLog 调试日志模块使用说明
## 功能概述
`debuglog.py` 提供了一个基于 `logging` 模块的调试日志系统,用于替代 `print()` 进行调试输出。
## 核心特性
-**单例模式**: 全局统一的日志管理
-**双重输出**: 同时输出到控制台和文件
-**按日期分文件**: 每天自动创建新的日志文件
-**多级别日志**: DEBUG, INFO, WARNING, ERROR, CRITICAL
-**详细信息**: 文件日志包含时间、模块、文件名、行号等
-**自动清理**: 支持清理旧日志文件
-**UTF-8编码**: 支持中文日志
## 日志文件位置
```
D:\restructure\liquid_level_line_detection_system\database\log\debuglog\
```
## 快速开始
### 1. 基本使用
```python
from handlers.debuglog import get_logger
# 创建logger(建议使用 __name__ 作为名称)
logger = get_logger(__name__)
# 记录不同级别的日志
logger.debug("调试信息")
logger.info("普通信息")
logger.warning("警告信息")
logger.error("错误信息")
logger.critical("严重错误")
```
### 2. 在类中使用
```python
from handlers.debuglog import get_logger
class MyClass:
def __init__(self):
self.logger = get_logger(self.__class__.__name__)
def do_something(self):
self.logger.info("开始执行操作")
try:
# 你的代码
result = self.process()
self.logger.info(f"操作成功,结果: {result}")
except Exception as e:
self.logger.error(f"操作失败: {e}", exc_info=True)
```
### 3. 在函数中使用
```python
from handlers.debuglog import get_logger
logger = get_logger(__name__)
def my_function(param):
logger.debug(f"函数调用,参数: {param}")
# 你的代码
result = param * 2
logger.info(f"函数执行完成,返回: {result}")
return result
```
## 高级用法
### 1. 只输出到文件(不显示在控制台)
```python
from handlers.debuglog import get_logger
logger = get_logger(
"my_module",
console_output=False, # 不输出到控制台
file_output=True # 只输出到文件
)
logger.info("这条消息只会写入日志文件")
```
### 2. 设置日志级别
```python
from handlers.debuglog import get_logger, INFO
# 只记录 INFO 及以上级别的日志
logger = get_logger("my_module", level=INFO)
logger.debug("这条不会显示") # DEBUG < INFO
logger.info("这条会显示") # INFO >= INFO
logger.warning("这条会显示") # WARNING > INFO
```
日志级别(从低到高):
- `DEBUG` (10) - 详细的调试信息
- `INFO` (20) - 一般信息
- `WARNING` (30) - 警告信息
- `ERROR` (40) - 错误信息
- `CRITICAL` (50) - 严重错误
### 3. 记录异常信息
```python
from handlers.debuglog import get_logger
logger = get_logger(__name__)
try:
result = 1 / 0
except Exception as e:
# exc_info=True 会记录完整的堆栈跟踪
logger.error(f"发生异常: {e}", exc_info=True)
```
### 4. 清理旧日志
```python
from handlers.debuglog import clear_old_logs
# 清理7天前的日志文件
clear_old_logs(days=7)
# 清理30天前的日志文件
clear_old_logs(days=30)
```
## 日志格式
### 控制台输出(简洁格式)
```
2025-11-29 15:30:45 - INFO - 这是一条信息
2025-11-29 15:30:46 - WARNING - 这是一条警告
2025-11-29 15:30:47 - ERROR - 这是一条错误
```
### 文件输出(详细格式)
```
2025-11-29 15:30:45 - my_module - INFO - [main.py:123] - 这是一条信息
2025-11-29 15:30:46 - my_module - WARNING - [main.py:124] - 这是一条警告
2025-11-29 15:30:47 - my_module - ERROR - [main.py:125] - 这是一条错误
```
## 实际应用示例
### 示例1: 在 auto_dot.py 中使用
```python
from handlers.debuglog import get_logger
class AutoAnnotationDetector:
def __init__(self, model_path: str = None, device: str = 'cuda'):
self.logger = get_logger(self.__class__.__name__)
self.model = None
self.model_path = model_path
self.device = self._validate_device(device)
if model_path:
self.load_model(model_path)
def load_model(self, model_path: str) -> bool:
try:
self.logger.info(f"开始加载模型: {model_path}")
if not os.path.exists(model_path):
self.logger.error(f"模型文件不存在: {model_path}")
return False
# 加载模型...
self.logger.info(f"模型加载成功: {os.path.basename(model_path)}")
return True
except Exception as e:
self.logger.error(f"模型加载失败: {e}", exc_info=True)
return False
def detect(self, image, conf_threshold=0.5, min_area=100):
self.logger.debug(f"开始检测 - 置信度阈值: {conf_threshold}, 最小面积: {min_area}")
try:
# 执行检测...
self.logger.info(f"检测完成,共 {len(valid_masks)} 个有效mask")
return result
except Exception as e:
self.logger.error(f"检测失败: {e}", exc_info=True)
return {'success': False, 'error': str(e)}
```
### 示例2: 替代现有的 print 语句
**之前(使用 print):**
```python
print(f"🔄 正在加载模型: {model_path}")
print(f"✅ 模型加载成功")
print(f"❌ 模型加载失败: {e}")
```
**之后(使用 logger):**
```python
logger.info(f"正在加载模型: {model_path}")
logger.info(f"模型加载成功")
logger.error(f"模型加载失败: {e}", exc_info=True)
```
### 示例3: 在测试函数中使用
```python
from handlers.debuglog import get_logger
def test_auto_annotation():
logger = get_logger("test_auto_annotation")
logger.info("="*80)
logger.info("自动标注功能测试")
logger.info("="*80)
# 配置参数
model_path = r"D:\...\best.dat"
logger.debug(f"模型路径: {model_path}")
# 检查文件
if not os.path.exists(model_path):
logger.error(f"模型文件不存在: {model_path}")
return
# 创建检测器
logger.info("初始化自动标注检测器...")
detector = AutoAnnotationDetector(model_path=model_path, device='cuda')
# 执行检测
logger.info("开始执行检测...")
detection_result = detector.detect(image, conf_threshold=0.5, min_area=100)
if detection_result.get('success'):
logger.info("检测成功")
else:
logger.error(f"检测失败: {detection_result.get('error')}")
```
## 最佳实践
1. **使用 `__name__` 作为 logger 名称**
```python
logger = get_logger(__name__)
```
2. **在类中创建实例变量**
```python
def __init__(self):
self.logger = get_logger(self.__class__.__name__)
```
3. **记录异常时使用 `exc_info=True`**
```python
except Exception as e:
logger.error(f"错误: {e}", exc_info=True)
```
4. **根据重要性选择合适的日志级别**
- `DEBUG`: 详细的调试信息(开发时使用)
- `INFO`: 正常的操作信息
- `WARNING`: 警告但不影响运行
- `ERROR`: 错误但程序可以继续
- `CRITICAL`: 严重错误,程序可能无法继续
5. **定期清理旧日志**
```python
# 在程序启动时清理旧日志
from handlers.debuglog import clear_old_logs
clear_old_logs(days=7)
```
## 测试
运行测试代码:
```bash
python handlers/debuglog.py
```
这会执行5个测试用例,展示各种使用方式。
## 注意事项
1. 日志文件按日期命名,格式为:`{logger_name}_{YYYYMMDD}.log`
2. 日志文件使用 UTF-8 编码,支持中文
3. 同一个 logger 名称会复用已创建的 logger 实例
4. 文件日志会追加写入,不会覆盖
5. 建议在生产环境中将日志级别设置为 `INFO` 或更高
++ "b/rules/git\346\214\207\344\273\244\351\233\206.md"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment