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.errorlogging.warninglogging.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

特别是因为您在验证其配置是否正确时尝试使用记录器。

修复?在确定记录器准备就绪之前不要使用它。