Python 除非在任何函数之前调用 basicConfig,否则不会创建日志文件
Python Log File is not created unless basicConfig is called on top before any functions
我有一个脚本可以处理 csvs 并将它们加载到数据库中。我的实习导师希望我们使用日志文件来捕获正在发生的事情,他希望它具有灵活性,以便人们可以使用 config.ini 文件来编辑他们希望创建日志文件的位置。结果我就是这样做的,使用一个配置文件,该文件在一个字典中使用键值对,我可以从中提取日志文件的路径。这些是我创建和使用日志文件的代码中的例外情况:
dirconfig_file = r"C:\Users\sys_nsgprobeingestio\Documents\dozie\odfs\venv\odfs_tester_history_dirs.ini"
start_time = datetime.now()
def process_dirconfig_file(config_file_from_sysarg):
try:
if Path.is_file(dirconfig_file_Pobj):
parseddict = {}
configsects_set = set()
for sect in config.sections():
configsects_set.add(sect)
for k, v in config.items(sect):
# print('{} = {}'.format(k, v))
parseddict[k] = v
print(parseddict)
try:
if ("log_dir" not in parseddict or parseddict["log_dir"] == "" or "log_dir" not in configsects_set):
raise Exception(f"Error: Your config file is missing 'logfile path' or properly formatted [log_file] section for this script to run. Please edit config file to include logfile path to capture errors")
except Exception as e:
#raise Exception(e)
logging.exception(e)
print(e)
parse_dict = process_dirconfig_file(dirconfig_file)
logfilepath = parse_dict["log_dir"]
log_file_name = start_time.strftime(logfilepath)
print(log_file_name)
logging.basicConfig(
filename=log_file_name,
level=logging.DEBUG,
format='[Probe Data Quality] %(asctime)s - %(name)s %(levelname)-7.7s %(message)s'
# can you explain this Tenzin?
)
if __name__ == '__main__':
try:
startTime = datetime.now()
db_instance = dbhandler(parse_dict["db_string"])
odfs_tabletest_dict = db_instance['odfs_tester_history_files']
odf_history_from_csv_to_dbtable(db_instance)
#print("test exception")
print(datetime.now() - startTime)
except Exception as e:
logging.exception(e)
print(e)
这样做,没有创建文件。脚本运行没有错误,但没有创建日志文件。我已经尝试了几种方法,包括使用硬编码的日志文件名,而不是从配置文件中调用它,但它没有用
唯一可行的是在任何方法之前创建日志文件。这是为什么?
当您调用 process_dirconfig_file
函数时,尚未设置日志记录配置,因此无法创建任何文件。该脚本从上到下执行。这类似于做这样的事情:
import sys
# default logging points to stdout/stderr kind of like this
my_logger = sys.stdout
my_logger.write("Something")
# Then you've pointed logging to a file
my_logger = open("some_file.log", 'w')
my_logger.write("Something else")
只有 Something else
会写入我们的 some_file.log
,因为 my_logger
事先指向其他地方。
同样的事情也发生在这里。默认情况下,logging.<debug/info>
函数什么都不做,因为 logging
在没有额外配置的情况下不会对它们做任何事情。 logging.error
、logging.warning
和 logging.exception
将始终至少写入开箱即用的标准输出。
此外,我认为内部 try
无效 Python,您需要匹配 except
。而且我不会只打印该函数引发的异常,我可能 raise
并让程序崩溃:
def process_dirconfig_file(config_file_from_sysarg):
try:
# Don't use logging.<anything> yet
~snip~
except Exception as e:
# Just raise or don't use try/except at all until
# you have a better idea of what you want to do in this circumstance
raise
特别是因为您在验证其配置是否正确时尝试使用记录器。
修复?在确定记录器准备就绪之前不要使用它。
我有一个脚本可以处理 csvs 并将它们加载到数据库中。我的实习导师希望我们使用日志文件来捕获正在发生的事情,他希望它具有灵活性,以便人们可以使用 config.ini 文件来编辑他们希望创建日志文件的位置。结果我就是这样做的,使用一个配置文件,该文件在一个字典中使用键值对,我可以从中提取日志文件的路径。这些是我创建和使用日志文件的代码中的例外情况:
dirconfig_file = r"C:\Users\sys_nsgprobeingestio\Documents\dozie\odfs\venv\odfs_tester_history_dirs.ini"
start_time = datetime.now()
def process_dirconfig_file(config_file_from_sysarg):
try:
if Path.is_file(dirconfig_file_Pobj):
parseddict = {}
configsects_set = set()
for sect in config.sections():
configsects_set.add(sect)
for k, v in config.items(sect):
# print('{} = {}'.format(k, v))
parseddict[k] = v
print(parseddict)
try:
if ("log_dir" not in parseddict or parseddict["log_dir"] == "" or "log_dir" not in configsects_set):
raise Exception(f"Error: Your config file is missing 'logfile path' or properly formatted [log_file] section for this script to run. Please edit config file to include logfile path to capture errors")
except Exception as e:
#raise Exception(e)
logging.exception(e)
print(e)
parse_dict = process_dirconfig_file(dirconfig_file)
logfilepath = parse_dict["log_dir"]
log_file_name = start_time.strftime(logfilepath)
print(log_file_name)
logging.basicConfig(
filename=log_file_name,
level=logging.DEBUG,
format='[Probe Data Quality] %(asctime)s - %(name)s %(levelname)-7.7s %(message)s'
# can you explain this Tenzin?
)
if __name__ == '__main__':
try:
startTime = datetime.now()
db_instance = dbhandler(parse_dict["db_string"])
odfs_tabletest_dict = db_instance['odfs_tester_history_files']
odf_history_from_csv_to_dbtable(db_instance)
#print("test exception")
print(datetime.now() - startTime)
except Exception as e:
logging.exception(e)
print(e)
这样做,没有创建文件。脚本运行没有错误,但没有创建日志文件。我已经尝试了几种方法,包括使用硬编码的日志文件名,而不是从配置文件中调用它,但它没有用
唯一可行的是在任何方法之前创建日志文件。这是为什么?
当您调用 process_dirconfig_file
函数时,尚未设置日志记录配置,因此无法创建任何文件。该脚本从上到下执行。这类似于做这样的事情:
import sys
# default logging points to stdout/stderr kind of like this
my_logger = sys.stdout
my_logger.write("Something")
# Then you've pointed logging to a file
my_logger = open("some_file.log", 'w')
my_logger.write("Something else")
只有 Something else
会写入我们的 some_file.log
,因为 my_logger
事先指向其他地方。
同样的事情也发生在这里。默认情况下,logging.<debug/info>
函数什么都不做,因为 logging
在没有额外配置的情况下不会对它们做任何事情。 logging.error
、logging.warning
和 logging.exception
将始终至少写入开箱即用的标准输出。
此外,我认为内部 try
无效 Python,您需要匹配 except
。而且我不会只打印该函数引发的异常,我可能 raise
并让程序崩溃:
def process_dirconfig_file(config_file_from_sysarg):
try:
# Don't use logging.<anything> yet
~snip~
except Exception as e:
# Just raise or don't use try/except at all until
# you have a better idea of what you want to do in this circumstance
raise
特别是因为您在验证其配置是否正确时尝试使用记录器。
修复?在确定记录器准备就绪之前不要使用它。