面试题答案
一键面试日志模块性能优化
- 减少I/O开销:
- 使用日志缓冲区:在内存中设置缓冲区,批量写入日志,而不是每次记录日志都进行I/O操作。Python的
logging
模块可以通过设置StreamHandler
的capacity
来实现简单的缓冲区。
import logging from logging.handlers import MemoryHandler memory_handler = MemoryHandler(capacity=1024, target=logging.FileHandler('app.log')) logger = logging.getLogger(__name__) logger.addHandler(memory_handler)
- 异步日志记录:使用
asyncio
库实现异步日志记录,避免主线程等待I/O操作完成。
import asyncio import logging async def log_async(message): await asyncio.get_running_loop().run_in_executor( None, lambda: logging.info(message) )
- 使用日志缓冲区:在内存中设置缓冲区,批量写入日志,而不是每次记录日志都进行I/O操作。Python的
- 避免日志记录成为性能瓶颈:
- 分级日志:根据日志级别进行区分,在生产环境中只记录重要级别的日志(如
ERROR
、CRITICAL
),减少不必要的日志记录。
logger.setLevel(logging.ERROR)
- 条件日志:仅在特定条件下记录日志,例如在调试模式或特定业务逻辑下。
if debug_mode: logger.debug('This is a debug message')
- 分级日志:根据日志级别进行区分,在生产环境中只记录重要级别的日志(如
日志安全配置
- 日志文件加密存储:
- 使用
cryptography
库:对日志文件进行加密和解密。
from cryptography.fernet import Fernet # 生成密钥 key = Fernet.generate_key() cipher_suite = Fernet(key) def encrypt_log(log_path): with open(log_path, 'rb') as f: log_data = f.read() encrypted_data = cipher_suite.encrypt(log_data) with open(log_path + '.encrypted', 'wb') as f: f.write(encrypted_data) def decrypt_log(encrypted_log_path): with open(encrypted_log_path, 'rb') as f: encrypted_data = f.read() decrypted_data = cipher_suite.decrypt(encrypted_data) with open(encrypted_log_path.replace('.encrypted', ''), 'wb') as f: f.write(decrypted_data)
- 使用
- 防止敏感信息泄露:
- 日志格式化过滤:在日志格式化时,过滤掉敏感信息。例如,对密码等信息进行掩码处理。
import re def mask_sensitive_info(message): message = re.sub(r'password=\S+', 'password=******', message) return message class SensitiveInfoFilter(logging.Filter): def filter(self, record): record.msg = mask_sensitive_info(record.msg) return True logger.addFilter(SensitiveInfoFilter())
- 访问控制:
- 设置文件权限:确保只有授权用户可以访问日志文件。在Linux系统中,可以使用
chmod
命令设置文件权限。
chmod 600 app.log
- 网络访问限制:如果日志通过网络传输,确保使用安全协议(如TLS),并限制网络访问范围。
- 设置文件权限:确保只有授权用户可以访问日志文件。在Linux系统中,可以使用