如何在Python脚本中创建带时间前缀的日志文件并保存所有运行日志
实现带时间戳日志记录的修改方案
方案1:最小改动(保留原有print语句)
不需要修改现有代码里的print调用,只需要在代码开头加一段配置,就能把所有控制台输出(包括print内容、requests库的报错等)同时输出到控制台和按要求命名的日志文件中:
- 新增依赖导入
import sys from datetime import datetime
- 新增双输出工具类,同时往控制台和文件写内容
class DualOutput: def __init__(self, filename): self.terminal = sys.stdout self.log = open(filename, "a", encoding="utf-8") def write(self, message): self.terminal.write(message) self.log.write(message) def flush(self): self.terminal.flush() self.log.flush()
- 代码开头初始化日志配置
# 生成符合要求的日志文件名 log_yyyy-MM-dd-hhmmss log_filename = datetime.now().strftime("log_%Y-%m-%d-%H%M%S.txt") # 重定向标准输出、错误输出 sys.stdout = DualOutput(log_filename) sys.stderr = DualOutput(log_filename)
方案2:规范日志方案(推荐)
用Python标准库logging替换原有print,可自动给每条日志加上时间前缀,还能捕获requests依赖库的运行日志,更适合长期运维追踪:
第一步:添加日志配置(放在代码开头)
import logging from datetime import datetime import sys # 生成日志文件名 log_filename = datetime.now().strftime("log_%Y-%m-%d-%H%M%S.log") # 全局日志配置 logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[ logging.FileHandler(log_filename, encoding="utf-8"), # 输出到文件 logging.StreamHandler(sys.stdout) # 同时输出到控制台 ] ) # 开启requests底层依赖的日志捕获 logging.getLogger("urllib3").setLevel(logging.INFO)
第二步:替换原有print语句
把原有所有print(xxx)替换为logging.info(xxx)即可,比如:
# 原代码 print('Extraction is not complete, we shall poll the location URL:') # 替换后 logging.info('Extraction is not complete, we shall poll the location URL:')
修正后完整可运行参考代码(基于方案1)
import requests import json import shutil import time import gzip import os import sys from datetime import datetime # ========== 日志配置开始 ========== class DualOutput: def __init__(self, filename): self.terminal = sys.stdout self.log = open(filename, "a", encoding="utf-8") def write(self, message): self.terminal.write(message) self.log.write(message) def flush(self): self.terminal.flush() self.log.flush() log_filename = datetime.now().strftime("log_%Y-%m-%d-%H%M%S.txt") sys.stdout = DualOutput(log_filename) sys.stderr = DualOutput(log_filename) # ========== 日志配置结束 ========== # 请在此处补充你原有生成r2、token、初始status_code的逻辑 # 以下为你原有代码的语法修复版本 # extraction request: if status_code == 202: requestUrl = r2.headers["location"] print('Extraction is not complete, we shall poll the location URL:') print(str(requestUrl)) requestHeaders = { "Prefer": "respond-async", "Content-Type": "application/json", "Authorization": "token " + token } while (status_code == 202): print('As we received a 202, we wait 30 seconds, then poll again (until we receive a 200)') time.sleep(30) r3 = requests.get(requestUrl, headers=requestHeaders) status_code = r3.status_code print('HTTP status of the response: ' + str(status_code))
内容的提问来源于stack exchange,提问作者Symonds
相关产品推荐
相关产品推荐

