You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:22:50