如何让Python日志类按日期自动切换日志文件?
树莓派Zero DHT22日志切换问题解决方案
问题背景
在树莓派Zero上使用Python3读取DHT22温湿度传感器,需要实现日志同时输出到终端+按年月日命名日志文件追加内容的功能。但原有代码仅在程序启动时创建/打开一次日志文件,日期变更后仍持续写入旧文件,需要无需复杂日志框架的简单修复方案。
修改后的完整代码
日志重定向类
import sys import datetime import time class Logger(object): def __init__(self): self.terminal = sys.stdout self.current_log_date = None self.log_file = None # 初始化时打开当日日志文件 self._open_log_file() def _get_today_filename(self): today = datetime.datetime.now() return f"dailytemplog{today.day}.{today.month}.{today.year}.log" def _open_log_file(self): # 关闭已打开的旧文件(如果存在) if self.log_file is not None: self.log_file.close() # 更新当前日期记录并打开新文件 today = datetime.datetime.now().date() self.current_log_date = today filename = self._get_today_filename() self.log_file = open(filename, "a") def write(self, message): # 每次写入前检查日期是否变更 today = datetime.datetime.now().date() if today != self.current_log_date: self._open_log_file() # 输出到终端和日志文件 self.terminal.write(message) self.log_file.write(message) # 强制刷新缓存,确保内容及时写入文件 self.log_file.flush() def flush(self): self.terminal.flush() if self.log_file is not None: self.log_file.flush() # 替换标准输出为自定义Logger sys.stdout = Logger()
传感器读取循环
# 请根据实际情况导入并初始化DHT22传感器,示例: # from adafruit_dht import DHT22 # import board # dhtDevice = DHT22(board.D4) while True: try: now = datetime.datetime.now() temperature_c = dhtDevice.temperature temperature_f = temperature_c * (9 / 5) + 32 humidity = dhtDevice.humidity print(f"Current Date and time: {now.day}/{now.month}/{now.year} {now.hour}:{now.minute}:{now.second}") print(f"Temp: {temperature_f:.1f} F / {temperature_c:.1f} C Humidity: {humidity}% ") except RuntimeError as error: # 若需要调试可取消注释下方打印 # print(f"传感器读取错误: {error}") pass time.sleep(5.0)
关键改动说明
- 拆分日志文件名生成与文件打开逻辑,避免重复代码
- 每次写入日志前检查当前日期,与已打开文件的日期对比,不一致则自动切换新文件
- 增加文件刷新操作,防止缓存导致日志内容延迟写入或丢失
- 移除全局时间变量,每次操作直接获取最新时间,避免变量过期问题
内容的提问来源于stack exchange,提问作者Raxis Phasmatis
相关产品推荐
相关产品推荐

