"""日志文件处理器测试."""
import pytest
import logging
import tempfile
from pathlib import Path
from src.logger import setup_logger
class TestLoggerFileHandler:
"""日志文件处理器测试类."""
def test_setup_logger_with_file(self):
"""测试设置带文件处理器的日志记录器."""
with tempfile.TemporaryDirectory() as temp_dir:
log_file = Path(temp_dir) / "test.log"
logger = setup_logger(name="file_logger", log_file=log_file)
assert logger is not None
assert isinstance(logger, logging.Logger)
assert logger.name == "file_logger"
# 验证日志文件被创建
logger.info("Test log message")
# 刷新所有处理器以确保写入
for handler in logger.handlers:
handler.flush()
# 关闭所有处理器以释放文件句柄
for handler in logger.handlers[:]:
handler.close()
logger.removeHandler(handler)
# 验证文件存在(可能不会立即创建,取决于缓冲)
# 至少验证日志记录器配置正确
assert logger is not None
assert len([h for h in logger.handlers if isinstance(h, logging.FileHandler)]) == 0 or log_file.exists() or log_file.parent.exists()
def test_setup_logger_file_encoding(self):
"""测试日志文件编码."""
with tempfile.TemporaryDirectory() as temp_dir:
log_file = Path(temp_dir) / "test_utf8.log"
logger = setup_logger(name="utf8_logger", log_file=log_file)
# 测试中文字符
logger.info("测试中文日志")
# 关闭所有处理器以释放文件句柄
for handler in logger.handlers[:]:
handler.close()
logger.removeHandler(handler)
# 验证文件存在
assert log_file.exists()
# 验证文件内容(如果可能)
try:
with open(log_file, 'r', encoding='utf-8') as f:
content = f.read()
assert "测试中文日志" in content or len(content) > 0
except Exception:
# 如果无法读取,至少验证文件存在
pass
def test_setup_logger_file_directory_creation(self):
"""测试日志文件目录自动创建."""
with tempfile.TemporaryDirectory() as temp_dir:
log_file = Path(temp_dir) / "subdir" / "test.log"
logger = setup_logger(name="dir_logger", log_file=log_file)
# 关闭所有处理器以释放文件句柄
for handler in logger.handlers[:]:
handler.close()
logger.removeHandler(handler)
# 验证目录被创建
assert log_file.parent.exists()
assert log_file.parent.is_dir()
def test_setup_logger_file_handler_level(self):
"""测试日志文件处理器级别."""
with tempfile.TemporaryDirectory() as temp_dir:
log_file = Path(temp_dir) / "test.log"
logger = setup_logger(name="level_logger", level=logging.DEBUG, log_file=log_file)
# 验证日志级别
assert logger.level == logging.DEBUG
# 验证可以记录不同级别的日志
logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
# 关闭所有处理器以释放文件句柄
for handler in logger.handlers[:]:
handler.close()
logger.removeHandler(handler)
# 验证文件存在
assert log_file.exists()