我的计划是每当运行一个脚本时,占用当前时间并为我生成的日志文件创建一个文件夹。脚本的每个步骤都会在此文件夹中生成一个新的日志文件。
问题是,我正在试图弄清楚如何在脚本的持续时间内使用相同的文件夹。现在发生的事情是每次创建记录器时它都会获得当前时间,每次都会创建一个新文件夹。
这是模块的样子:
logger.py
...
CURRENT_TIME = # get current time
LOG_FOLDER = "logs/%s/" % CURRENT_TIME
...
def get_logger(name):
# Create a log file with the given name in the LOG_FOLDER
每当我import logger.py
重新计算CURRENT_TIME
时,会发生什么。我认为避免这种情况的方法是from logger.py import *
为所有模块执行一次代码,使它们具有相同的日志文件夹。
主问题是脚本调用其他python脚本,生成新进程等。当这些新进程导入记录器时,他们尚未导入它,因此它们将重新生成CURRENT_TIME
。
那么解决这个问题的好方法是什么?我想到的一个解决方案是让记录器使用一个名为temp
的常量文件夹,并在主脚本完成后将其重命名为当前时间(或将当前时间存储在脚本的开头)。我真的不喜欢这个解决方案,就好像有异常或错误并且脚本死了,文件夹将保留temp
当我希望它在那种情况下是脚本的时间,所以我知道它何时失败
答案 0 :(得分:1)
经典的解决方案是使用一个环境变量,它将在您的进程和所有子进程之间共享。
演示(另存为x.py,警告:会一遍又一遍地调用自己):
import os
import random
from subprocess import call
def get_logger():
return os.environ.setdefault("LOG_DIR", logger_name())
def logger_name(): return "log" + str(random.random())
print "Process " + str(os.getpid()) + " uses " + get_logger()
call(["python", "x.py"])
参考文献:os.environ docs,the concept环境变量
答案 1 :(得分:1)
更好的方法是在应用程序启动时实现RotatingFileHandler
并执行doRollover()
。
答案 2 :(得分:0)
首次启动脚本时,将starttime写入temp目录中的文件。
当记录器运行时,它会在temp目录中的文件中查找时间值。
如果您的脚本崩溃,那么当您再次启动主脚本时,它将替换之前的值,因此此次运行的日志将位于正确的位置。
您甚至可以使用清理脚本从临时目录中删除启动时间。